http://fredrik.appelberg.me/2010/05/07/aop-js/
Aop = {
// Apply around advice to all matching functions in the given namespaces
around: function(pointcut, advice, namespaces) {
// if no namespaces are supplied, use a trick to determine the global ns
if (namespaces == undefined || namespaces.length == 0)
namespaces = [ (function(){return this;}).call() ];
// loop over all namespaces
for(var i in namespaces) {
var ns = namespaces[i];
for(var member in ns) {
if(typeof ns[member] == 'function' && member.match(pointcut)) {
(function(fn, fnName, ns) {
// replace the member fn slot with a wrapper which calls
// the 'advice' Function
ns[fnName] = function() {
return advice.call(ns, { fn: fn,
fnName: fnName,
arguments: arguments });
};
})(ns[member], member, ns);
}
}
}
},
next: function(f) {
return f.fn.apply(this, f.arguments);
}
};
example:
function hello(){
console.log('hello');
}
Aop.around('hello',function(fun){
console.log('before');
Aop.next(fun);
console.log('after');
});