75 lines
1.8 KiB
JavaScript
75 lines
1.8 KiB
JavaScript
|
dojo.provide("dojox.lang.oo.aop");
|
||
|
|
||
|
dojo.require("dojox.lang.oo.Decorator");
|
||
|
dojo.require("dojox.lang.oo.chain");
|
||
|
dojo.require("dojox.lang.oo.general");
|
||
|
|
||
|
(function(){
|
||
|
var oo = dojox.lang.oo, md = oo.makeDecorator, ooa = oo.aop;
|
||
|
|
||
|
// five decorators implementing light-weight AOP weaving
|
||
|
|
||
|
/*=====
|
||
|
ooa.before = md(function(name, newValue, oldValue){
|
||
|
// summary: creates a "before" advise, by calling new function
|
||
|
// before the old one
|
||
|
|
||
|
// dummy body
|
||
|
});
|
||
|
|
||
|
ooa.around = md(function(name, newValue, oldValue){
|
||
|
// summary: creates an "around" advise,
|
||
|
// the previous value is passed as a first argument and can be null,
|
||
|
// arguments are passed as a second argument
|
||
|
|
||
|
// dummy body
|
||
|
});
|
||
|
=====*/
|
||
|
|
||
|
// reuse existing decorators
|
||
|
ooa.before = oo.chain.before;
|
||
|
ooa.around = oo.general.wrap;
|
||
|
|
||
|
ooa.afterReturning = md(function(name, newValue, oldValue){
|
||
|
// summary: creates an "afterReturning" advise,
|
||
|
// the returned value is passed as the only argument
|
||
|
return dojo.isFunction(oldValue) ?
|
||
|
function(){
|
||
|
var ret = oldValue.apply(this, arguments);
|
||
|
newValue.call(this, ret);
|
||
|
return ret;
|
||
|
} : function(){ newValue.call(this); };
|
||
|
});
|
||
|
|
||
|
ooa.afterThrowing = md(function(name, newValue, oldValue){
|
||
|
// summary: creates an "afterThrowing" advise,
|
||
|
// the exception is passed as the only argument
|
||
|
return dojo.isFunction(oldValue) ?
|
||
|
function(){
|
||
|
var ret;
|
||
|
try{
|
||
|
ret = oldValue.apply(this, arguments);
|
||
|
}catch(e){
|
||
|
newValue.call(this, e);
|
||
|
throw e;
|
||
|
}
|
||
|
return ret;
|
||
|
} : oldValue;
|
||
|
});
|
||
|
|
||
|
ooa.after = md(function(name, newValue, oldValue){
|
||
|
// summary: creates an "after" advise,
|
||
|
// it takes no arguments
|
||
|
return dojo.isFunction(oldValue) ?
|
||
|
function(){
|
||
|
var ret;
|
||
|
try{
|
||
|
ret = oldValue.apply(this, arguments);
|
||
|
}finally{
|
||
|
newValue.call(this);
|
||
|
}
|
||
|
return ret;
|
||
|
} : function(){ newValue.call(this); }
|
||
|
});
|
||
|
})();
|