]> git.wh0rd.org - tt-rss.git/blobdiff - lib/dojo/AdapterRegistry.js
build custom layer of Dojo to speed up loading of tt-rss (refs #293)
[tt-rss.git] / lib / dojo / AdapterRegistry.js
index 1939cfa98fb9b88d815b1291653c184bb97354e0..bb6a60f4103cb8de83a811d20ea3cad16a9cb7ae 100644 (file)
 */
 
 
-if(!dojo._hasResource["dojo.AdapterRegistry"]){
-dojo._hasResource["dojo.AdapterRegistry"]=true;
+if(!dojo._hasResource["dojo.AdapterRegistry"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.AdapterRegistry"] = true;
 dojo.provide("dojo.AdapterRegistry");
-dojo.AdapterRegistry=function(_1){
-this.pairs=[];
-this.returnWrappers=_1||false;
-};
-dojo.extend(dojo.AdapterRegistry,{register:function(_2,_3,_4,_5,_6){
-this.pairs[((_6)?"unshift":"push")]([_2,_3,_4,_5]);
-},match:function(){
-for(var i=0;i<this.pairs.length;i++){
-var _7=this.pairs[i];
-if(_7[1].apply(this,arguments)){
-if((_7[3])||(this.returnWrappers)){
-return _7[2];
-}else{
-return _7[2].apply(this,arguments);
-}
-}
-}
-throw new Error("No match found");
-},unregister:function(_8){
-for(var i=0;i<this.pairs.length;i++){
-var _9=this.pairs[i];
-if(_9[0]==_8){
-this.pairs.splice(i,1);
-return true;
-}
+
+dojo.AdapterRegistry = function(/*Boolean?*/ returnWrappers){
+       //      summary:
+       //              A registry to make contextual calling/searching easier.
+       //      description:
+       //              Objects of this class keep list of arrays in the form [name, check,
+       //              wrap, directReturn] that are used to determine what the contextual
+       //              result of a set of checked arguments is. All check/wrap functions
+       //              in this registry should be of the same arity.
+       //      example:
+       //      |       // create a new registry
+       //      |       var reg = new dojo.AdapterRegistry();
+       //      |       reg.register("handleString",
+       //      |               dojo.isString,
+       //      |               function(str){
+       //      |                       // do something with the string here
+       //      |               }
+       //      |       );
+       //      |       reg.register("handleArr",
+       //      |               dojo.isArray,
+       //      |               function(arr){
+       //      |                       // do something with the array here
+       //      |               }
+       //      |       );
+       //      |
+       //      |       // now we can pass reg.match() *either* an array or a string and
+       //      |       // the value we pass will get handled by the right function
+       //      |       reg.match("someValue"); // will call the first function
+       //      |       reg.match(["someValue"]); // will call the second
+
+       this.pairs = [];
+       this.returnWrappers = returnWrappers || false; // Boolean
 }
-return false;
-}});
+
+dojo.extend(dojo.AdapterRegistry, {
+       register: function(/*String*/ name, /*Function*/ check, /*Function*/ wrap, /*Boolean?*/ directReturn, /*Boolean?*/ override){
+               //      summary: 
+               //              register a check function to determine if the wrap function or
+               //              object gets selected
+               //      name:
+               //              a way to identify this matcher.
+               //      check:
+               //              a function that arguments are passed to from the adapter's
+               //              match() function.  The check function should return true if the
+               //              given arguments are appropriate for the wrap function.
+               //      directReturn:
+               //              If directReturn is true, the value passed in for wrap will be
+               //              returned instead of being called. Alternately, the
+               //              AdapterRegistry can be set globally to "return not call" using
+               //              the returnWrappers property. Either way, this behavior allows
+               //              the registry to act as a "search" function instead of a
+               //              function interception library.
+               //      override:
+               //              If override is given and true, the check function will be given
+               //              highest priority. Otherwise, it will be the lowest priority
+               //              adapter.
+               this.pairs[((override) ? "unshift" : "push")]([name, check, wrap, directReturn]);
+       },
+
+       match: function(/* ... */){
+               // summary:
+               //              Find an adapter for the given arguments. If no suitable adapter
+               //              is found, throws an exception. match() accepts any number of
+               //              arguments, all of which are passed to all matching functions
+               //              from the registered pairs.
+               for(var i = 0; i < this.pairs.length; i++){
+                       var pair = this.pairs[i];
+                       if(pair[1].apply(this, arguments)){
+                               if((pair[3])||(this.returnWrappers)){
+                                       return pair[2];
+                               }else{
+                                       return pair[2].apply(this, arguments);
+                               }
+                       }
+               }
+               throw new Error("No match found");
+       },
+
+       unregister: function(name){
+               // summary: Remove a named adapter from the registry
+
+               // FIXME: this is kind of a dumb way to handle this. On a large
+               // registry this will be slow-ish and we can use the name as a lookup
+               // should we choose to trade memory for speed.
+               for(var i = 0; i < this.pairs.length; i++){
+                       var pair = this.pairs[i];
+                       if(pair[0] == name){
+                               this.pairs.splice(i, 1);
+                               return true;
+                       }
+               }
+               return false;
+       }
+});
+
 }