/** * AOP framework for aspect oriented programming in JavaScript */ var AOP = AOP || function() { //Private methods function toArray(iterable) { if (!iterable) return []; if (iterable.toArray) return iterable.toArray(); var length = iterable.length || 0, results = new Array(length); while (length--) results[length] = iterable[length]; return results; } //Public methods var public = { around: function(obj, fname, advice) { var oldFunc = obj[fname]; obj[fname] = function() { var args = [oldFunc].concat(toArray(arguments)); return advice.apply(this, args); }; }, before: function(obj, fname, advice) { var oldFunc = obj[fname]; obj[fname] = function() { var args = [oldFunc].concat(toArray(arguments)); advice.apply(this, args); return oldFunc.apply(this, arguments); }; }, after: function(obj, fname, advice) { var oldFunc = obj[fname]; obj[fname] = function() { var args = [oldFunc].concat(toArray(arguments)); oldFunc.apply(this, arguments); return advice.apply(this, args); }; }, callMethod: function(args) { var argsArray = toArray(args); return argsArray[0].apply(this, argsArray.slice(1)); } }; return public; }();