var protoclass = require("protoclass");
function BaseExpression() {
this._children = [];
this._addChildren(Array.prototype.slice.call(arguments, 0));
}
protoclass(BaseExpression, {
/**
*/
__isExpression: true,
/**
*/
_addChildren: function(children) {
for (var i = children.length; i--;) {
var child = children[i];
if (!child) continue;
if (child.__isExpression) {
this._children.push(child);
} else if (typeof child === "object") {
for (var k in child) {
this._addChildren([child[k]]);
}
}
}
},
/**
*/
filterAllChildren: function(filter) {
var filtered = [];
this.traverseChildren(function(child) {
if (filter(child)) {
filtered.push(child);
}
});
return filtered;
},
/**
*/
traverseChildren: function(fn) {
fn(this);
for (var i = this._children.length; i--;) {
var child = this._children[i];
child.traverseChildren(fn);
}
}
});
module.exports = BaseExpression;
|