• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1
2/**
3 * Expose `Delegator`.
4 */
5
6module.exports = Delegator;
7
8/**
9 * Initialize a delegator.
10 *
11 * @param {Object} proto
12 * @param {String} target
13 * @api public
14 */
15
16function Delegator(proto, target) {
17  if (!(this instanceof Delegator)) return new Delegator(proto, target);
18  this.proto = proto;
19  this.target = target;
20  this.methods = [];
21  this.getters = [];
22  this.setters = [];
23  this.fluents = [];
24}
25
26/**
27 * Delegate method `name`.
28 *
29 * @param {String} name
30 * @return {Delegator} self
31 * @api public
32 */
33
34Delegator.prototype.method = function(name){
35  var proto = this.proto;
36  var target = this.target;
37  this.methods.push(name);
38
39  proto[name] = function(){
40    return this[target][name].apply(this[target], arguments);
41  };
42
43  return this;
44};
45
46/**
47 * Delegator accessor `name`.
48 *
49 * @param {String} name
50 * @return {Delegator} self
51 * @api public
52 */
53
54Delegator.prototype.access = function(name){
55  return this.getter(name).setter(name);
56};
57
58/**
59 * Delegator getter `name`.
60 *
61 * @param {String} name
62 * @return {Delegator} self
63 * @api public
64 */
65
66Delegator.prototype.getter = function(name){
67  var proto = this.proto;
68  var target = this.target;
69  this.getters.push(name);
70
71  proto.__defineGetter__(name, function(){
72    return this[target][name];
73  });
74
75  return this;
76};
77
78/**
79 * Delegator setter `name`.
80 *
81 * @param {String} name
82 * @return {Delegator} self
83 * @api public
84 */
85
86Delegator.prototype.setter = function(name){
87  var proto = this.proto;
88  var target = this.target;
89  this.setters.push(name);
90
91  proto.__defineSetter__(name, function(val){
92    return this[target][name] = val;
93  });
94
95  return this;
96};
97
98/**
99 * Delegator fluent accessor
100 *
101 * @param {String} name
102 * @return {Delegator} self
103 * @api public
104 */
105
106Delegator.prototype.fluent = function (name) {
107  var proto = this.proto;
108  var target = this.target;
109  this.fluents.push(name);
110
111  proto[name] = function(val){
112    if ('undefined' != typeof val) {
113      this[target][name] = val;
114      return this;
115    } else {
116      return this[target][name];
117    }
118  };
119
120  return this;
121};
122