Ticket #4411: auto-getters.patch

File auto-getters.patch, 2.7 KB (added by Scott González, 13 years ago)
  • Users/sgonzale/Documents/workspace/jQuery

     
    203203
    204204// $.widget is a factory to create jQuery plugins
    205205// taking some boilerplate code out of the plugin code
    206 function getter(namespace, plugin, method, args) {
    207         function getMethods(type) {
    208                 var methods = $[namespace][plugin][type] || [];
    209                 return (typeof methods == 'string' ? methods.split(/,?\s+/) : methods);
    210         }
    211 
    212         var methods = getMethods('getter');
    213         if (args.length == 1 && typeof args[0] == 'string') {
    214                 methods = methods.concat(getMethods('getterSetter'));
    215         }
    216         return ($.inArray(method, methods) != -1);
    217 }
    218 
    219206$.widget = function(name, prototype) {
    220207        var namespace = name.split(".")[0],
    221208                fullName;
     
    230217        // create plugin method
    231218        $.fn[name] = function(options) {
    232219                var isMethodCall = (typeof options == 'string'),
    233                         args = Array.prototype.slice.call(arguments, 1);
     220                        args = Array.prototype.slice.call(arguments, 1),
     221                        returnValue = this;
    234222
    235223                // prevent calls to internal methods
    236224                if (isMethodCall && options.substring(0, 1) == '_') {
    237                         return this;
     225                        return returnValue;
    238226                }
    239227
    240                 // handle getter methods
    241                 if (isMethodCall && getter(namespace, name, options, args)) {
    242                         var instance = $.data(this[0], name);
    243                         return (instance ? instance[options].apply(instance, args)
    244                                 : undefined);
    245                 }
    246 
    247                 // handle initialization and non-getter methods
    248                 return this.each(function() {
    249                         var instance = $.data(this, name);
    250 
    251                         // constructor
    252                         (!instance && !isMethodCall &&
    253                                 $.data(this, name, new $[namespace][name](this, options))._init());
     228                (isMethodCall
     229                        ? this.each(function() {
     230                                var instance = $.data(this, name),
     231                                        methodValue = (instance && $.isFunction(instance[options])
     232                                                ? instance[options].apply(instance, args)
     233                                                : instance);
     234                                if (methodValue !== instance) {
     235                                        returnValue = methodValue;
     236                                        return false;
     237                                }
     238                        })
     239                        : this.each(function() {
     240                                ($.data(this, name) ||
     241                                        $.data(this, name, new $[namespace][name](this, options))._init());
     242                        }));
    254243
    255                         // method call
    256                         (instance && isMethodCall && $.isFunction(instance[options]) &&
    257                                 instance[options].apply(instance, args));
    258                 });
     244                return returnValue;
    259245        };
    260246
    261247        // create widget constructor
     
    292278
    293279        // add widget prototype
    294280        $[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype);
    295 
    296         // TODO: merge getter and getterSetter properties from widget prototype
    297         // and plugin prototype
    298         $[namespace][name].getterSetter = 'option';
    299281};
    300282
    301283$.widget.prototype = {