UNPKG

bind-late

Version:

Late binding of overridable object properties.

54 lines (45 loc) 1.25 kB
"use strict"; 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;