| |
| /** |
| * Expose `Delegator`. |
| */ |
| |
| module.exports = Delegator; |
| |
| /** |
| * Initialize a delegator. |
| * |
| * @param {Object} proto |
| * @param {String} target |
| * @api public |
| */ |
| |
| function Delegator(proto, target) { |
| if (!(this instanceof Delegator)) return new Delegator(proto, target); |
| this.proto = proto; |
| this.target = target; |
| this.methods = []; |
| this.getters = []; |
| this.setters = []; |
| this.fluents = []; |
| } |
| |
| /** |
| * Delegate method `name`. |
| * |
| * @param {String} name |
| * @return {Delegator} self |
| * @api public |
| */ |
| |
| Delegator.prototype.method = function(name){ |
| var proto = this.proto; |
| var target = this.target; |
| this.methods.push(name); |
| |
| proto[name] = function(){ |
| return this[target][name].apply(this[target], arguments); |
| }; |
| |
| return this; |
| }; |
| |
| /** |
| * Delegator accessor `name`. |
| * |
| * @param {String} name |
| * @return {Delegator} self |
| * @api public |
| */ |
| |
| Delegator.prototype.access = function(name){ |
| return this.getter(name).setter(name); |
| }; |
| |
| /** |
| * Delegator getter `name`. |
| * |
| * @param {String} name |
| * @return {Delegator} self |
| * @api public |
| */ |
| |
| Delegator.prototype.getter = function(name){ |
| var proto = this.proto; |
| var target = this.target; |
| this.getters.push(name); |
| |
| proto.__defineGetter__(name, function(){ |
| return this[target][name]; |
| }); |
| |
| return this; |
| }; |
| |
| /** |
| * Delegator setter `name`. |
| * |
| * @param {String} name |
| * @return {Delegator} self |
| * @api public |
| */ |
| |
| Delegator.prototype.setter = function(name){ |
| var proto = this.proto; |
| var target = this.target; |
| this.setters.push(name); |
| |
| proto.__defineSetter__(name, function(val){ |
| return this[target][name] = val; |
| }); |
| |
| return this; |
| }; |
| |
| /** |
| * Delegator fluent accessor |
| * |
| * @param {String} name |
| * @return {Delegator} self |
| * @api public |
| */ |
| |
| Delegator.prototype.fluent = function (name) { |
| var proto = this.proto; |
| var target = this.target; |
| this.fluents.push(name); |
| |
| proto[name] = function(val){ |
| if ('undefined' != typeof val) { |
| this[target][name] = val; |
| return this; |
| } else { |
| return this[target][name]; |
| } |
| }; |
| |
| return this; |
| }; |