~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/static/javascript/yui/build/base/base.js

  • Committer: Martin Albisetti
  • Date: 2008-10-20 21:18:06 UTC
  • mfrom: (229.1.3 add-yui-3)
  • Revision ID: martin.albisetti@canonical.com-20081020211806-rzs0ya40gz9wcpoz
Added yui library to the tree. Welcome to the future. (Paul Hummer)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
 
3
Code licensed under the BSD License:
 
4
http://developer.yahoo.net/yui/license.txt
 
5
version: 3.0.0pr1
 
6
*/
 
7
YUI.add('base', function(Y) {
 
8
 
 
9
    /**
 
10
     * Base class support for objects requiring
 
11
     * managed attributes and acting as event targets
 
12
     *
 
13
     * @module base
 
14
     */
 
15
 
 
16
    var L = Y.Lang,
 
17
        O = Y.Object,
 
18
        SEP = ":",
 
19
        DESTROY = "destroy",
 
20
        INIT = "init",
 
21
        VALUE = "value",
 
22
        INITIALIZED = "initialized",
 
23
        DESTROYED = "destroyed",
 
24
        INITIALIZER = "initializer",
 
25
        DESTRUCTOR = "destructor";
 
26
 
 
27
    var ETP = Y.Event.Target.prototype;
 
28
 
 
29
    /**
 
30
     * <p>
 
31
     * Provides a base class for managed attribute based
 
32
     * objects, which handles the chaining of initializer and destructor methods
 
33
     * across the hierarchy during init and destroy lifecycle methods and 
 
34
     * handles automatic configuration of registered Attributes, through 
 
35
     * the static <a href="#property_ATTRS">ATTRS</a> property.
 
36
     * </p>
 
37
     *
 
38
     * <p>The Base class also handles prefixing of event types with the static <a href="#property_NAME">NAME</a> 
 
39
     * property for all events fired from instances of classes derived from Base.</p>
 
40
     *
 
41
     * @constructor
 
42
     * @class Base
 
43
     * @uses Attribute
 
44
     *
 
45
     * @param {Object} config Object literal of configuration property name/value pairs
 
46
     */
 
47
    var Base = function() {
 
48
        Y.Attribute.call(this);
 
49
        this.init.apply(this, arguments);
 
50
    };
 
51
 
 
52
    /**
 
53
     * <p>
 
54
     * Name string to be used to identify instances of 
 
55
     * this class, for example in prefixing events.
 
56
     * </p>
 
57
     * <p>
 
58
     * Classes extending Base, should define their own
 
59
     * static NAME property.
 
60
     * </p>
 
61
     * @property NAME
 
62
     * @type String
 
63
     * @static
 
64
     */
 
65
    Base.NAME = 'base';
 
66
 
 
67
    /**
 
68
     * Object literal defining the set of attributes which
 
69
     * will be available for instances of this class, and 
 
70
     * how they are configured. See Attributes addAtt method
 
71
     * for a description of configuration options available 
 
72
     * for each attribute.
 
73
     *
 
74
     * @property ATTRS
 
75
     * @type Object
 
76
     * @static
 
77
     */
 
78
    Base.ATTRS = {
 
79
        /**
 
80
         * Flag indicating whether or not this object
 
81
         * has been through the init lifecycle phase.
 
82
         *
 
83
         * @attribute initialized
 
84
         * @readOnly
 
85
         * @default false
 
86
         * @type boolean
 
87
         */
 
88
        intialized: {
 
89
            readOnly:true,
 
90
            value:false
 
91
        },
 
92
 
 
93
        /**
 
94
         * Flag indicating whether or not this object
 
95
         * has been through the destroy lifecycle phase.
 
96
         *
 
97
         * @attribute destroyed
 
98
         * @readOnly
 
99
         * @default false
 
100
         * @type boolean
 
101
         */
 
102
        destroyed: {
 
103
            readOnly:true,
 
104
            value:false
 
105
        }
 
106
    };
 
107
 
 
108
    var _instances = {};
 
109
 
 
110
    /**
 
111
     * <p>
 
112
     * Builds a constructor function (class) from the
 
113
     * main function, and array of extension functions (classes)
 
114
     * provided.
 
115
     * </p>
 
116
     * <p>
 
117
     * The cfg object literal supports the following properties
 
118
     * </p>
 
119
     * <dl>
 
120
     *    <dt>dynamic &#60;boolean&#62;</dt>
 
121
     *    <dd>
 
122
     *    <p>If true, a completely new class
 
123
     *    is created which extends the main class, and acts as the 
 
124
     *    host on which the extension classes are augmented.</p>
 
125
     *    <p>If false, the extensions classes are augmented directly to
 
126
     *    the main class, modifying the main classes prototype.</p>
 
127
     *    </dd>
 
128
     *    <dt>aggregates &#60;String[]&#62;</dt>
 
129
     *    <dd>An array of static property names, which will get aggregated
 
130
     *    on to the built class in addition to the default properties build 
 
131
     *    will always aggregate - "ATTRS" and "PLUGINS", as defined by 
 
132
     *    Base.build.AGGREGATES</dd>
 
133
     * </dl>
 
134
     *
 
135
     * @method build
 
136
     * @static
 
137
     * @param {Function} main The main class on which to base the built class
 
138
     * @param {Function[]} extensions The set of extension classes which will be
 
139
     * augmented/aggregated to the built class.
 
140
     * @param {Object} cfg
 
141
     * @return {Function} A custom class, created from the provided main and extension classes
 
142
     */
 
143
    Base.build = function(main, extensions, cfg) {
 
144
 
 
145
        var build = Base.build,
 
146
            builtClass,
 
147
            extClass,
 
148
            aggregates,
 
149
            dynamic,
 
150
            key = main.NAME;
 
151
 
 
152
        if (cfg) {
 
153
            aggregates = cfg.aggregates;
 
154
            dynamic = cfg.dynamic;
 
155
        }
 
156
 
 
157
        // Create dynamic class or just modify main class
 
158
        builtClass = (dynamic) ? build._template(main) : main;
 
159
 
 
160
        builtClass._yuibuild = {
 
161
            id: null,
 
162
            exts : [],
 
163
            dynamic : dynamic
 
164
        };
 
165
 
 
166
        aggregates = (aggregates) ? build.AGGREGATES.concat(aggregates) : build.AGGREGATES;
 
167
 
 
168
        var el = extensions.length,
 
169
            al = aggregates.length,
 
170
            i;
 
171
 
 
172
        // Shallow isolate aggregates
 
173
        if (dynamic && aggregates) {
 
174
            for (i = 0; i < al; i++) {
 
175
                var val = aggregates[i];
 
176
                if (O.owns(main, val)) {
 
177
                    builtClass[val] = L.isArray(main[val]) ? [] : {};
 
178
                }
 
179
            }
 
180
            Y.aggregate(builtClass, main, true, aggregates);
 
181
        }
 
182
 
 
183
        // Augment/Aggregate
 
184
        for (i = 0; i < el; i++) {
 
185
            extClass = extensions[i];
 
186
 
 
187
            if (aggregates) {
 
188
                Y.aggregate(builtClass, extClass, true, aggregates);
 
189
            }
 
190
 
 
191
            // Old augment
 
192
            Y.mix(builtClass, extClass, true, null, 1);
 
193
 
 
194
            builtClass._yuibuild.exts.push(extClass);
 
195
            key = key + ":" + Y.stamp(extClass);
 
196
        }
 
197
 
 
198
        builtClass._yuibuild.id = key;
 
199
        builtClass.prototype.hasImpl = build._hasImpl;
 
200
 
 
201
        if (dynamic) {
 
202
            builtClass.NAME = main.NAME;
 
203
            builtClass.prototype.constructor = builtClass;
 
204
        }
 
205
 
 
206
        return builtClass;
 
207
    };
 
208
 
 
209
    Y.mix(Base.build, {
 
210
 
 
211
        AGGREGATES : ["ATTRS", "PLUGINS"],
 
212
 
 
213
        _template: function(main) {
 
214
 
 
215
            function BuiltClass() {
 
216
                BuiltClass.superclass.constructor.apply(this, arguments);
 
217
 
 
218
                var f = BuiltClass._yuibuild.exts, 
 
219
                    l = f.length;
 
220
 
 
221
                for (var i = 0; i < l; i++) {
 
222
                    f[i].apply(this, arguments);
 
223
                }
 
224
                return this;
 
225
            }
 
226
 
 
227
            Y.extend(BuiltClass, main);
 
228
 
 
229
            return BuiltClass;
 
230
        },
 
231
 
 
232
        _hasImpl : function(extClass) {
 
233
            if (this.constructor._yuibuild) {
 
234
                var f = this.constructor._yuibuild.exts,
 
235
                    l = f.length,
 
236
                    i;
 
237
 
 
238
                for (i = 0; i < l; i++) {
 
239
                    if (f[i] === extClass) {
 
240
                        return true;
 
241
                    }
 
242
                }
 
243
            }
 
244
 
 
245
            return false;
 
246
        }
 
247
    });
 
248
 
 
249
    /**
 
250
     * <p>
 
251
     * Creates a new object instance, based on a dynamically created custom class.
 
252
     * The custom class is created from the main class passed in as the first parameter 
 
253
     * along with the list of extension classes passed in
 
254
     * as the second parameter using <a href="#method_build">Base.build</a> 
 
255
     * with "dynamic" set to true. See the documentation for this method 
 
256
     * to see how the main class and extension classes are used.
 
257
     * </p>
 
258
     * 
 
259
     * <p>Any arguments following the 2nd argument are passed as arguments to the 
 
260
     * constructor of the newly created class used to create the instance.</p>
 
261
     * 
 
262
     * @method create
 
263
     * @static
 
264
     *
 
265
     * @param {Function} main The main class on which the instance it to be 
 
266
     * based. This class will be extended to create the class for the custom instance
 
267
     * @param {Array} extensions The list of extension classes used to augment the
 
268
     * main class with.
 
269
     * @param {Any*} args* 0..n arguments to pass to the constructor of the 
 
270
     * newly created class, when creating the instance.
 
271
     * @return {Object} An instance of the custom class
 
272
     */
 
273
    Base.create = function(main, extensions, args) {
 
274
        var c = Base.build(main, extensions, {dynamic:true}),
 
275
            cArgs = Y.Array(arguments, 2, true);
 
276
 
 
277
        function F(){}
 
278
        F.prototype = c.prototype;
 
279
 
 
280
        return c.apply(new F(), cArgs);
 
281
    };
 
282
 
 
283
    Base.prototype = {
 
284
 
 
285
        /**
 
286
         * Init lifecycle method, invoked during construction.
 
287
         * Fires the init event prior to invoking initializers on
 
288
         * the class hierarchy.
 
289
         * 
 
290
         * @method init
 
291
         * @final
 
292
         * @chainable
 
293
         * @param {Object} config Object literal of configuration property name/value pairs
 
294
         * @return {Base} A reference to this object
 
295
         */
 
296
        init: function(config) {
 
297
 
 
298
            /**
 
299
             * The name string to be used to identify 
 
300
             * this instance of object. 
 
301
             * @property name
 
302
             * @type String
 
303
             */
 
304
            this.name = this.constructor.NAME;
 
305
 
 
306
            /**
 
307
             * <p>
 
308
             * Init event, fired prior to initialization. Invoking
 
309
             * the preventDefault method on the event object provided 
 
310
             * to subscribers will prevent initialization from occuring.
 
311
             * </p>
 
312
             * <p>
 
313
             * Subscribers to the "after" momemt of this event, will be notified
 
314
             * after initialization of the object is complete (and therefore
 
315
             * cannot prevent initialization).
 
316
             * </p>
 
317
             *
 
318
             * @event init
 
319
             * @preventable _defInitFn
 
320
             * @param {Event.Facade} e Event object
 
321
             * @param config Object literal of configuration name/value pairs
 
322
             */
 
323
            this.publish(INIT, {
 
324
                queuable:false,
 
325
                defaultFn:this._defInitFn
 
326
            });
 
327
            this.fire(INIT, config);
 
328
 
 
329
            return this;
 
330
        },
 
331
 
 
332
        /**
 
333
         * <p>
 
334
         * Destroy lifecycle method. Fires the destroy
 
335
         * event, prior to invoking destructors for the
 
336
         * class hierarchy.
 
337
         * </p>
 
338
         * <p>
 
339
         * Subscribers to the destroy
 
340
         * event can invoke preventDefault on the event object, to prevent destruction
 
341
         * from proceeding.
 
342
         * </p>
 
343
         * @method destroy
 
344
         * @return {Base} A reference to this object
 
345
         * @final
 
346
         * @chainable
 
347
         */
 
348
        destroy: function() {
 
349
 
 
350
            /**
 
351
             * <p>
 
352
             * Destroy event, fired prior to destruction. Invoking
 
353
             * the preventDefault method on the event object provided 
 
354
             * to subscribers will prevent destruction from proceeding.
 
355
             * </p>
 
356
             * <p>
 
357
             * Subscribers to the "after" moment of this event, will be notified
 
358
             * after destruction is complete (and as a result cannot prevent
 
359
             * destruction).
 
360
             * </p>
 
361
             * @event destroy
 
362
             * @preventable _defDestroyFn
 
363
             * @param {Event.Facade} e Event object
 
364
             */
 
365
            this.publish(DESTROY, {
 
366
                queuable:false,
 
367
                defaultFn: this._defDestroyFn
 
368
            });
 
369
            this.fire(DESTROY);
 
370
            return this;
 
371
        },
 
372
 
 
373
        /**
 
374
         * Default init event handler
 
375
         *
 
376
         * @method _defInitFn
 
377
         * @param {Object} config Object literal of configuration property name/value pairs
 
378
         * @protected
 
379
         */
 
380
        _defInitFn : function(config) {
 
381
            _instances[Y.stamp(this)] = this;
 
382
            this._initHierarchy(config);
 
383
 
 
384
            this._conf.remove(INITIALIZED, VALUE);
 
385
            this.set(INITIALIZED, true);
 
386
        },
 
387
 
 
388
        /**
 
389
         * Default destroy event handler
 
390
         *
 
391
         * @method _defDestroyFn
 
392
         * @protected
 
393
         */
 
394
        _defDestroyFn : function() {
 
395
            this._destroyHierarchy();
 
396
            delete _instances[this._yuid];
 
397
 
 
398
            this._conf.remove(DESTROYED, VALUE);
 
399
            this.set(DESTROYED, true);
 
400
        },
 
401
 
 
402
        /**
 
403
         * Returns the top down class hierarchy for this object,
 
404
         * with Base being the first class in the array.
 
405
         *
 
406
         * @protected
 
407
         * @return {Function[]} An Array of classes (constructor functions), making up the class heirarchy for this object
 
408
         */
 
409
        _getClasses : function() {
 
410
            if (!this._classes) {
 
411
                var c = this.constructor, 
 
412
                    classes = [];
 
413
 
 
414
                while (c && c.prototype) {
 
415
                    classes.unshift(c);
 
416
                    c = c.superclass ? c.superclass.constructor : null;
 
417
                }
 
418
                this._classes = classes;
 
419
            }
 
420
            return this._classes.concat();
 
421
        },
 
422
 
 
423
        /**
 
424
         * Initializes the class hierarchy rooted at this base class,
 
425
         * which includes initializing attributes for each class defined 
 
426
         * in the class's static <a href="#property_ATTRS">ATTRS</a> property and invoking the initializer 
 
427
         * method on the prototype of each class in the hierarchy.
 
428
         * 
 
429
         * @method _initHierarchy
 
430
         * @param {Object} userConf Object literal containing attribute name/value pairs
 
431
         * @private
 
432
         */
 
433
        _initHierarchy : function(userConf) {
 
434
            var constr,
 
435
                classes = this._getClasses();
 
436
 
 
437
            for (var ci = 0, cl = classes.length; ci < cl; ci++) {
 
438
                constr = classes[ci];
 
439
 
 
440
                if (constr._yuibuild && constr._yuibuild.exts && !constr._yuibuild.dynamic) {
 
441
                    for (var ei = 0, el = constr._yuibuild.exts.length; ei < el; ei++) {
 
442
                        constr._yuibuild.exts[ei].apply(this, arguments);
 
443
                    }
 
444
                }
 
445
 
 
446
                this._initAtts(constr.ATTRS, userConf);
 
447
 
 
448
                if (O.owns(constr.prototype, INITIALIZER)) {
 
449
                    constr.prototype[INITIALIZER].apply(this, arguments);
 
450
                }
 
451
            }
 
452
        },
 
453
 
 
454
        /**
 
455
         * Destroys the class hierarchy rooted at this base class by invoking
 
456
         * the descructor method on the prototype of each class in the hierarchy.
 
457
         *
 
458
         * @method _destroyHierarchy
 
459
         * @private
 
460
         */
 
461
        _destroyHierarchy : function() {
 
462
            var constr,
 
463
                classes = this._getClasses();
 
464
 
 
465
            for (var ci = classes.length-1; ci >= 0; ci--) {
 
466
                constr = classes[ci];
 
467
                if (O.owns(constr.prototype, DESTRUCTOR)) {
 
468
                    constr.prototype[DESTRUCTOR].apply(this, arguments);
 
469
                }
 
470
            }
 
471
        },
 
472
 
 
473
        /**
 
474
         * Default toString implementation. Provides the constructor NAME
 
475
         * and the instance ID.
 
476
         * 
 
477
         * @method toString
 
478
         * @return {String} String representation for this object
 
479
         */
 
480
        toString: function() {
 
481
            return this.constructor.NAME + "[" + Y.stamp(this) + "]";
 
482
        },
 
483
 
 
484
        /**
 
485
         * <p>
 
486
         * Subscribe to a custom event hosted by this object.
 
487
         * </p>
 
488
         * <p>
 
489
         * Overrides Event.Target's <a href="Event.Target.html#method_subscribe">subscribe</a> method, to add the name prefix 
 
490
         * of the instance to the event type, if absent.
 
491
         * </p>
 
492
         * 
 
493
         * @method subscribe
 
494
         * @param {String} type The type of event to subscribe to. If 
 
495
         * the type string does not contain a prefix ("prefix:eventType"), 
 
496
         * the name property of the instance will be used as the default prefix.
 
497
         * @param {Function} fn The subscribed callback function, invoked when the event is fired.
 
498
         * @param {Object} context Optional execution context for the callback.
 
499
         * @param {Any*} args* 0..n params to supply to the callback
 
500
         * 
 
501
         * @return {Event.Handle} An event handle which can be used to unsubscribe the subscribed callback.
 
502
         */
 
503
        subscribe : function() {
 
504
            var a = arguments;
 
505
            a[0] = this._prefixEvtType(a[0]);
 
506
            return ETP.subscribe.apply(this, a);
 
507
        },
 
508
 
 
509
        /**
 
510
         * <p>
 
511
         * Fire a custom event by name.  The callback functions will be executed
 
512
         * from the context specified when the event was created, and with the 
 
513
         * following parameters.
 
514
         * </p>
 
515
         * <p>
 
516
         * Overrides Event.Target's <a href="Event.Target.html#method_fire">fire</a> method, to add the name prefix 
 
517
         * of the instance to the event type, if absent.
 
518
         * </p>
 
519
         * 
 
520
         * @method fire
 
521
         * @param {String|Object} type The type of the event, or an object that contains
 
522
         * a 'type' property. If the type does not contain a prefix ("prefix:eventType"),
 
523
         * the name property of the instance will be used as the default prefix.
 
524
         * @param {Any*} args* 0..n Additional arguments to pass to subscribers.
 
525
         * @return {boolean} The return value from Event Target's <a href="Event.Target.html#method_fire">fire</a> method.
 
526
         *
 
527
         */
 
528
        fire : function() {
 
529
            var a = arguments;
 
530
            if (L.isString(a[0])) {
 
531
                a[0] = this._prefixEvtType(a[0]);
 
532
            } else if (a[0].type){
 
533
                a[0].type = this._prefixEvtType(a[0].type);
 
534
            }
 
535
            return ETP.fire.apply(this, a);
 
536
        },
 
537
 
 
538
        /**
 
539
         * <p>
 
540
         * Creates a new custom event of the specified type.  If a custom event
 
541
         * by that name already exists, it will not be re-created.  In either
 
542
         * case the custom event is returned. 
 
543
         * </p>
 
544
         * <p>
 
545
         * Overrides Event.Target's <a href="Event.Target.html#method_publish">publish</a> method, to add the name prefix 
 
546
         * of the instance to the event type, if absent.
 
547
         * </p>
 
548
         *
 
549
         * @method publish
 
550
         * @param {String} type  The type, or name of the event. If the type does not 
 
551
         * contain a prefix ("prefix:eventType"), the name property of the instance will 
 
552
         * be used as the default prefix.
 
553
         * @param {Object} opts Optional config params (see Event.Target <a href="Event.Target.html#method_publish">publish</a> for details)
 
554
         * @return {Event.Custom} The published custom event object
 
555
         */
 
556
        publish : function() {
 
557
            var a = arguments;
 
558
            a[0] = this._prefixEvtType(a[0]);
 
559
            return ETP.publish.apply(this, a);
 
560
        },
 
561
 
 
562
        /**
 
563
         * <p>
 
564
         * Subscribe to a custom event hosted by this object.  The
 
565
         * supplied callback will execute <em>after</em> any listeners added
 
566
         * via the subscribe method, and after the default function,
 
567
         * if configured for the event, has executed.
 
568
         * </p>
 
569
         * <p>
 
570
         * Overrides Event.Target's <a href="Event.Target.html#method_after">after</a> method, to add the name prefix 
 
571
         * of the instance to the event type, if absent.
 
572
         * </p>
 
573
         * @method after
 
574
         * @param {String} type The type of event to subscribe to. If 
 
575
         * the type string does not contain a prefix ("prefix:eventType"), 
 
576
         * the name property of the instance will be used as the default prefix.
 
577
         * @param {Function} fn  The subscribed callback function
 
578
         * @param {Object} context Optional execution context for the callback
 
579
         * @param {Any*} args* 0..n params to supply to the callback
 
580
         * @return {Event.Handle} Event handle which can be used to unsubscribe the subscribed callback.
 
581
         */
 
582
        after : function() {
 
583
            var a = arguments;
 
584
            a[0] = this._prefixEvtType(a[0]);
 
585
            return ETP.after.apply(this, a);
 
586
        },
 
587
 
 
588
        /**
 
589
         * <p>
 
590
         * Unsubscribes one or more listeners the from the specified event.
 
591
         * </p>
 
592
         * <p>
 
593
         * Overrides Event.Target's <a href="Event.Target.html#method_unsubscribe">unsubscribe</a> method, to add the name prefix 
 
594
         * of the instance to the event type, if absent.
 
595
         * </p>
 
596
         * @method unsubscribe
 
597
         * @param {String|Object} type Either the handle to the subscriber or the 
 
598
         *                        type of event.  If the type
 
599
         *                        is not specified, it will attempt to remove
 
600
         *                        the listener from all hosted events. If 
 
601
         *                        the type string does not contain a prefix 
 
602
         *                        ("prefix:eventType"), the name property of the 
 
603
         *                        instance will be used as the default prefix.
 
604
         * @param {Function} fn The subscribed function to unsubscribe, if not
 
605
         *                          supplied, all subscribers will be removed.
 
606
         * @param {Object} context The custom object passed to subscribe.  This is
 
607
         *                        optional, but if supplied will be used to
 
608
         *                        disambiguate multiple listeners that are the same
 
609
         *                        (e.g., you subscribe many object using a function
 
610
         *                        that lives on the prototype)
 
611
         * @return {boolean} true if the subscriber was found and detached.
 
612
         */
 
613
        unsubscribe: function(type, fn, context) {
 
614
            var a = arguments;
 
615
            if (L.isString(a[0])) {
 
616
                a[0] = this._prefixEvtType(a[0]);
 
617
            }
 
618
            return ETP.unsubscribe.apply(this, a);
 
619
        },
 
620
 
 
621
        /**
 
622
         * <p>
 
623
         * Removes all listeners from the specified event.  If the event type
 
624
         * is not specified, all listeners from all hosted custom events will
 
625
         * be removed.
 
626
         * </p>
 
627
         * <p>
 
628
         * Overrides Event.Target's <a href="Event.Target.html#method_unsubscribeAll">unsubscribeAll</a> method, to add the name prefix 
 
629
         * of the instance to the event type, if absent.
 
630
         * </p>
 
631
         * @method unsubscribeAll
 
632
         * @param {String} type The type, or name of the event. If 
 
633
         * the type string does not contain a prefix ("prefix:eventType"), 
 
634
         * the name property of the instance will be used as the default prefix
 
635
         * @return {int} The number of listeners unsubscribed
 
636
         */
 
637
        unsubscribeAll: function(type) {
 
638
            var a = arguments;
 
639
            a[0] = this._prefixEvtType(a[0]);
 
640
            return ETP.unsubscribeAll.apply(this, a);
 
641
        },
 
642
 
 
643
        /**
 
644
         * Utility method to prefix the event name with the
 
645
         * name property of the instance, if absent
 
646
         *
 
647
         * @method _prefixEvtType
 
648
         * @private
 
649
         * @param {String} type The event name
 
650
         * @return {String} The prefixed event name
 
651
         */
 
652
        _prefixEvtType: function(type) {
 
653
            if (type.indexOf(SEP) === -1 && this.name) {
 
654
               type = this.name + ":" + type;
 
655
            }
 
656
            return type;
 
657
        }
 
658
    };
 
659
 
 
660
    Y.mix(Base, Y.Attribute, false, null, 1);
 
661
 
 
662
    Y.Base = Base;
 
663
 
 
664
 
 
665
 
 
666
}, '3.0.0pr1' ,{requires:['attribute']});