Project

General

Profile

Statistics
| Revision:

root / trunk / web / dojo / dojox / lang / aspect.js @ 12

History | View | Annotate | Download (4.12 KB)

1
/*
2
        Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
3
        Available via Academic Free License >= 2.1 OR the modified BSD license.
4
        see: http://dojotoolkit.org/license for details
5
*/
6

    
7

    
8
if(!dojo._hasResource["dojox.lang.aspect"]){
9
dojo._hasResource["dojox.lang.aspect"]=true;
10
dojo.provide("dojox.lang.aspect");
11
(function(){
12
var d=dojo,_1=dojox.lang.aspect,ap=Array.prototype,_2=[],_3;
13
var _4=function(){
14
this.next_before=this.prev_before=this.next_around=this.prev_around=this.next_afterReturning=this.prev_afterReturning=this.next_afterThrowing=this.prev_afterThrowing=this;
15
this.counter=0;
16
};
17
d.extend(_4,{add:function(_5){
18
var _6=d.isFunction(_5),_7={advice:_5,dynamic:_6};
19
this._add(_7,"before","",_6,_5);
20
this._add(_7,"around","",_6,_5);
21
this._add(_7,"after","Returning",_6,_5);
22
this._add(_7,"after","Throwing",_6,_5);
23
++this.counter;
24
return _7;
25
},_add:function(_8,_9,_a,_b,_c){
26
var _d=_9+_a;
27
if(_b||_c[_9]||(_a&&_c[_d])){
28
var _e="next_"+_d,_f="prev_"+_d;
29
(_8[_f]=this[_f])[_e]=_8;
30
(_8[_e]=this)[_f]=_8;
31
}
32
},remove:function(_10){
33
this._remove(_10,"before");
34
this._remove(_10,"around");
35
this._remove(_10,"afterReturning");
36
this._remove(_10,"afterThrowing");
37
--this.counter;
38
},_remove:function(_11,_12){
39
var _13="next_"+_12,_14="prev_"+_12;
40
if(_11[_13]){
41
_11[_13][_14]=_11[_14];
42
_11[_14][_13]=_11[_13];
43
}
44
},isEmpty:function(){
45
return !this.counter;
46
}});
47
var _15=function(){
48
return function(){
49
var _16=arguments.callee,_17=_16.advices,ret,i,a,e,t;
50
if(_3){
51
_2.push(_3);
52
}
53
_3={instance:this,joinPoint:_16,depth:_2.length,around:_17.prev_around,dynAdvices:[],dynIndex:0};
54
try{
55
for(i=_17.prev_before;i!=_17;i=i.prev_before){
56
if(i.dynamic){
57
_3.dynAdvices.push(a=new i.advice(_3));
58
if(t=a.before){
59
t.apply(a,arguments);
60
}
61
}else{
62
t=i.advice;
63
t.before.apply(t,arguments);
64
}
65
}
66
try{
67
ret=(_17.prev_around==_17?_16.target:_1.proceed).apply(this,arguments);
68
}
69
catch(e){
70
_3.dynIndex=_3.dynAdvices.length;
71
for(i=_17.next_afterThrowing;i!=_17;i=i.next_afterThrowing){
72
a=i.dynamic?_3.dynAdvices[--_3.dynIndex]:i.advice;
73
if(t=a.afterThrowing){
74
t.call(a,e);
75
}
76
if(t=a.after){
77
t.call(a);
78
}
79
}
80
throw e;
81
}
82
_3.dynIndex=_3.dynAdvices.length;
83
for(i=_17.next_afterReturning;i!=_17;i=i.next_afterReturning){
84
a=i.dynamic?_3.dynAdvices[--_3.dynIndex]:i.advice;
85
if(t=a.afterReturning){
86
t.call(a,ret);
87
}
88
if(t=a.after){
89
t.call(a);
90
}
91
}
92
var ls=_16._listeners;
93
for(i in ls){
94
if(!(i in ap)){
95
ls[i].apply(this,arguments);
96
}
97
}
98
}
99
finally{
100
for(i=0;i<_3.dynAdvices.length;++i){
101
a=_3.dynAdvices[i];
102
if(a.destroy){
103
a.destroy();
104
}
105
}
106
_3=_2.length?_2.pop():null;
107
}
108
return ret;
109
};
110
};
111
_1.advise=function(obj,_18,_19){
112
if(typeof obj!="object"){
113
obj=obj.prototype;
114
}
115
var _1a=[];
116
if(!(_18 instanceof Array)){
117
_18=[_18];
118
}
119
for(var j=0;j<_18.length;++j){
120
var t=_18[j];
121
if(t instanceof RegExp){
122
for(var i in obj){
123
if(d.isFunction(obj[i])&&t.test(i)){
124
_1a.push(i);
125
}
126
}
127
}else{
128
if(d.isFunction(obj[t])){
129
_1a.push(t);
130
}
131
}
132
}
133
if(!d.isArray(_19)){
134
_19=[_19];
135
}
136
return _1.adviseRaw(obj,_1a,_19);
137
};
138
_1.adviseRaw=function(obj,_1b,_1c){
139
if(!_1b.length||!_1c.length){
140
return null;
141
}
142
var m={},al=_1c.length;
143
for(var i=_1b.length-1;i>=0;--i){
144
var _1d=_1b[i],o=obj[_1d],ao=new Array(al),t=o.advices;
145
if(!t){
146
var x=obj[_1d]=_15();
147
x.target=o.target||o;
148
x.targetName=_1d;
149
x._listeners=o._listeners||[];
150
x.advices=new _4;
151
t=x.advices;
152
}
153
for(var j=0;j<al;++j){
154
ao[j]=t.add(_1c[j]);
155
}
156
m[_1d]=ao;
157
}
158
return [obj,m];
159
};
160
_1.unadvise=function(_1e){
161
if(!_1e){
162
return;
163
}
164
var obj=_1e[0],_1f=_1e[1];
165
for(var _20 in _1f){
166
var o=obj[_20],t=o.advices,ao=_1f[_20];
167
for(var i=ao.length-1;i>=0;--i){
168
t.remove(ao[i]);
169
}
170
if(t.isEmpty()){
171
var _21=true,ls=o._listeners;
172
if(ls.length){
173
for(i in ls){
174
if(!(i in ap)){
175
_21=false;
176
break;
177
}
178
}
179
}
180
if(_21){
181
obj[_20]=o.target;
182
}else{
183
var x=obj[_20]=d._listener.getDispatcher();
184
x.target=o.target;
185
x._listeners=ls;
186
}
187
}
188
}
189
};
190
_1.getContext=function(){
191
return _3;
192
};
193
_1.getContextStack=function(){
194
return _2;
195
};
196
_1.proceed=function(){
197
var _22=_3.joinPoint,_23=_22.advices;
198
for(var c=_3.around;c!=_23;c=_3.around){
199
_3.around=c.prev_around;
200
if(c.dynamic){
201
var a=_3.dynAdvices[_3.dynIndex++],t=a.around;
202
if(t){
203
return t.apply(a,arguments);
204
}
205
}else{
206
return c.advice.around.apply(c.advice,arguments);
207
}
208
}
209
return _22.target.apply(_3.instance,arguments);
210
};
211
})();
212
}