diff options
author | Barak Korren <[email protected]> | 2013-04-02 20:38:07 +0300 |
---|---|---|
committer | Barak Korren <[email protected]> | 2013-04-02 20:38:07 +0300 |
commit | 58a2577d48790c79adfd44bcfd662c980ce6cfe4 (patch) | |
tree | 523d814ea0b7b6f617fe515b186099c6e83fed72 /lib/dojo/aspect.js.uncompressed.js | |
parent | e470a273cf09562fb2f9c0c899002303f19c8d16 (diff) | |
parent | cc332603431102a682feda22b9cf0093a29f0176 (diff) |
Merge branch 'master' of https://github.com/gothfox/Tiny-Tiny-RSS.git
Diffstat (limited to 'lib/dojo/aspect.js.uncompressed.js')
-rw-r--r-- | lib/dojo/aspect.js.uncompressed.js | 216 |
1 files changed, 0 insertions, 216 deletions
diff --git a/lib/dojo/aspect.js.uncompressed.js b/lib/dojo/aspect.js.uncompressed.js deleted file mode 100644 index 6752aedcf..000000000 --- a/lib/dojo/aspect.js.uncompressed.js +++ /dev/null @@ -1,216 +0,0 @@ -define("dojo/aspect", [], function(){ - - // module: - // dojo/aspect - - "use strict"; - var undefined, nextId = 0; - function advise(dispatcher, type, advice, receiveArguments){ - var previous = dispatcher[type]; - var around = type == "around"; - var signal; - if(around){ - var advised = advice(function(){ - return previous.advice(this, arguments); - }); - signal = { - remove: function(){ - signal.cancelled = true; - }, - advice: function(target, args){ - return signal.cancelled ? - previous.advice(target, args) : // cancelled, skip to next one - advised.apply(target, args); // called the advised function - } - }; - }else{ - // create the remove handler - signal = { - remove: function(){ - var previous = signal.previous; - var next = signal.next; - if(!next && !previous){ - delete dispatcher[type]; - }else{ - if(previous){ - previous.next = next; - }else{ - dispatcher[type] = next; - } - if(next){ - next.previous = previous; - } - } - }, - id: nextId++, - advice: advice, - receiveArguments: receiveArguments - }; - } - if(previous && !around){ - if(type == "after"){ - // add the listener to the end of the list - // note that we had to change this loop a little bit to workaround a bizarre IE10 JIT bug - while(previous.next && (previous = previous.next)){} - previous.next = signal; - signal.previous = previous; - }else if(type == "before"){ - // add to beginning - dispatcher[type] = signal; - signal.next = previous; - previous.previous = signal; - } - }else{ - // around or first one just replaces - dispatcher[type] = signal; - } - return signal; - } - function aspect(type){ - return function(target, methodName, advice, receiveArguments){ - var existing = target[methodName], dispatcher; - if(!existing || existing.target != target){ - // no dispatcher in place - target[methodName] = dispatcher = function(){ - var executionId = nextId; - // before advice - var args = arguments; - var before = dispatcher.before; - while(before){ - args = before.advice.apply(this, args) || args; - before = before.next; - } - // around advice - if(dispatcher.around){ - var results = dispatcher.around.advice(this, args); - } - // after advice - var after = dispatcher.after; - while(after && after.id < executionId){ - if(after.receiveArguments){ - var newResults = after.advice.apply(this, args); - // change the return value only if a new value was returned - results = newResults === undefined ? results : newResults; - }else{ - results = after.advice.call(this, results, args); - } - after = after.next; - } - return results; - }; - if(existing){ - dispatcher.around = {advice: function(target, args){ - return existing.apply(target, args); - }}; - } - dispatcher.target = target; - } - var results = advise((dispatcher || existing), type, advice, receiveArguments); - advice = null; - return results; - }; - } - - // TODOC: after/before/around return object - - var after = aspect("after"); - /*===== - after = function(target, methodName, advice, receiveArguments){ - // summary: - // The "after" export of the aspect module is a function that can be used to attach - // "after" advice to a method. This function will be executed after the original method - // is executed. By default the function will be called with a single argument, the return - // value of the original method, or the the return value of the last executed advice (if a previous one exists). - // The fourth (optional) argument can be set to true to so the function receives the original - // arguments (from when the original method was called) rather than the return value. - // If there are multiple "after" advisors, they are executed in the order they were registered. - // target: Object - // This is the target object - // methodName: String - // This is the name of the method to attach to. - // advice: Function - // This is function to be called after the original method - // receiveArguments: Boolean? - // If this is set to true, the advice function receives the original arguments (from when the original mehtod - // was called) rather than the return value of the original/previous method. - // returns: - // A signal object that can be used to cancel the advice. If remove() is called on this signal object, it will - // stop the advice function from being executed. - }; - =====*/ - - var before = aspect("before"); - /*===== - before = function(target, methodName, advice){ - // summary: - // The "before" export of the aspect module is a function that can be used to attach - // "before" advice to a method. This function will be executed before the original method - // is executed. This function will be called with the arguments used to call the method. - // This function may optionally return an array as the new arguments to use to call - // the original method (or the previous, next-to-execute before advice, if one exists). - // If the before method doesn't return anything (returns undefined) the original arguments - // will be preserved. - // If there are multiple "before" advisors, they are executed in the reverse order they were registered. - // target: Object - // This is the target object - // methodName: String - // This is the name of the method to attach to. - // advice: Function - // This is function to be called before the original method - }; - =====*/ - - var around = aspect("around"); - /*===== - around = function(target, methodName, advice){ - // summary: - // The "around" export of the aspect module is a function that can be used to attach - // "around" advice to a method. The advisor function is immediately executed when - // the around() is called, is passed a single argument that is a function that can be - // called to continue execution of the original method (or the next around advisor). - // The advisor function should return a function, and this function will be called whenever - // the method is called. It will be called with the arguments used to call the method. - // Whatever this function returns will be returned as the result of the method call (unless after advise changes it). - // example: - // If there are multiple "around" advisors, the most recent one is executed first, - // which can then delegate to the next one and so on. For example: - // | around(obj, "foo", function(originalFoo){ - // | return function(){ - // | var start = new Date().getTime(); - // | var results = originalFoo.apply(this, arguments); // call the original - // | var end = new Date().getTime(); - // | console.log("foo execution took " + (end - start) + " ms"); - // | return results; - // | }; - // | }); - // target: Object - // This is the target object - // methodName: String - // This is the name of the method to attach to. - // advice: Function - // This is function to be called around the original method - }; - =====*/ - - return { - // summary: - // provides aspect oriented programming functionality, allowing for - // one to add before, around, or after advice on existing methods. - // example: - // | define(["dojo/aspect"], function(aspect){ - // | var signal = aspect.after(targetObject, "methodName", function(someArgument){ - // | this will be called when targetObject.methodName() is called, after the original function is called - // | }); - // - // example: - // The returned signal object can be used to cancel the advice. - // | signal.remove(); // this will stop the advice from being executed anymore - // | aspect.before(targetObject, "methodName", function(someArgument){ - // | // this will be called when targetObject.methodName() is called, before the original function is called - // | }); - - before: before, - around: around, - after: after - }; -}); |