| 'use strict'; |
| |
| var copy = require('es5-ext/object/copy') |
| , map = require('es5-ext/object/map') |
| , callable = require('es5-ext/object/valid-callable') |
| , validValue = require('es5-ext/object/valid-value') |
| |
| , bind = Function.prototype.bind, defineProperty = Object.defineProperty |
| , hasOwnProperty = Object.prototype.hasOwnProperty |
| , define; |
| |
| define = function (name, desc, bindTo) { |
| var value = validValue(desc) && callable(desc.value), dgs; |
| dgs = copy(desc); |
| delete dgs.writable; |
| delete dgs.value; |
| dgs.get = function () { |
| if (hasOwnProperty.call(this, name)) return value; |
| desc.value = bind.call(value, (bindTo == null) ? this : this[bindTo]); |
| defineProperty(this, name, desc); |
| return this[name]; |
| }; |
| return dgs; |
| }; |
| |
| module.exports = function (props/*, bindTo*/) { |
| var bindTo = arguments[1]; |
| return map(props, function (desc, name) { |
| return define(name, desc, bindTo); |
| }); |
| }; |