bind-late
Version:
Late binding of overridable object properties.
54 lines (45 loc) • 1.25 kB
JavaScript
;
var assign = require("object-assign");
var isPlainObject = require("is-plain-object");
var lazy = require("lazy-object").defineLazyProperty;
var makeOverridable = require("make-overridable");
var keys = function (object, f) {
Object.keys(object).forEach(f);
return object;
};
var traverse = function (object, f) {
var root = arguments[2] === undefined ? object : arguments[2];
return (function () {
return keys(object, function (key) {
var value = object[key];
if (isPlainObject(value)) {
traverse(value, f, root);
} else {
f(value, key, object);
}
});
})();
};
var isUnderscored = function (f) {
return f.toString().substr(0, 12) === "function (_)";
};
var isLateBinding = function (x) {
return x instanceof Function && isUnderscored(x);
};
function Dumb(object) {
assign(this, object);
}
var doBindLate = function (object) {
return traverse(object, function (value, key, node) {
if (isLateBinding(value)) {
lazy(node, key, function () {
return value(object);
});
}
});
};
var bindLate = function (object) {
return doBindLate(new Dumb(object));
};
module.exports = makeOverridable(bindLate);
module.exports.bindLate = bindLate;