parsejs 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/.gitignore +18 -0
 - data/.rspec +1 -0
 - data/.travis.yml +9 -0
 - data/Gemfile +5 -0
 - data/README.markdown +85 -0
 - data/Rakefile +15 -0
 - data/lib/parsejs.rb +14 -0
 - data/lib/parsejs/ast.rb +84 -0
 - data/lib/parsejs/docs.rb +237 -0
 - data/lib/parsejs/grammar.kpeg +575 -0
 - data/lib/parsejs/grammar.kpeg.rb +9460 -0
 - data/lib/parsejs/scope.rb +183 -0
 - data/lib/parsejs/stringifier.rb +450 -0
 - data/lib/parsejs/version.rb +3 -0
 - data/lib/parsejs/visitor.rb +257 -0
 - data/parsejs.gemspec +24 -0
 - data/spec/fixtures/jquery-1.6.js +8982 -0
 - data/spec/fixtures/jquery-1.7.js +9289 -0
 - data/spec/fixtures/jquery-ajax.js +1000 -0
 - data/spec/fixtures/jquery-attributes.js +650 -0
 - data/spec/fixtures/jquery-traversing.js +330 -0
 - data/spec/fixtures/metamorph.js +324 -0
 - data/spec/fixtures/sizzle.js +1442 -0
 - data/spec/fixtures/sproutcore-core.js +195 -0
 - data/spec/fixtures/sproutcore-each-proxy.js +218 -0
 - data/spec/fixtures/sproutcore-native-array.js +139 -0
 - data/spec/fixtures/sproutcore.js +14319 -0
 - data/spec/scope_spec.rb +111 -0
 - data/spec/stringify_spec.rb +587 -0
 - data/test.rb +76 -0
 - metadata +145 -0
 
| 
         @@ -0,0 +1,195 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            // ==========================================================================
         
     | 
| 
      
 2 
     | 
    
         
            +
            // Project:  SproutCore Runtime
         
     | 
| 
      
 3 
     | 
    
         
            +
            // Copyright: ©2011 Strobe Inc. and contributors.
         
     | 
| 
      
 4 
     | 
    
         
            +
            // License:   Licensed under MIT license (see license.js)
         
     | 
| 
      
 5 
     | 
    
         
            +
            // ==========================================================================
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            // NOTE: this object should never be included directly.  Instead use SC.
         
     | 
| 
      
 10 
     | 
    
         
            +
            // SC.Object.  We only define this separately so that SC.Set can depend on it
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            var rewatch = SC.rewatch;
         
     | 
| 
      
 15 
     | 
    
         
            +
            var classToString = SC.Mixin.prototype.toString;
         
     | 
| 
      
 16 
     | 
    
         
            +
            var set = SC.set, get = SC.get;
         
     | 
| 
      
 17 
     | 
    
         
            +
            var o_create = SC.platform.create,
         
     | 
| 
      
 18 
     | 
    
         
            +
                meta = SC.meta;
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            function makeCtor() {
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              // Note: avoid accessing any properties on the object since it makes the
         
     | 
| 
      
 23 
     | 
    
         
            +
              // method a lot faster.  This is glue code so we want it to be as fast as
         
     | 
| 
      
 24 
     | 
    
         
            +
              // possible.
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
              var isPrepared = false, initMixins, init = false, hasChains = false;
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
              var Class = function() {
         
     | 
| 
      
 29 
     | 
    
         
            +
                if (!isPrepared) { get(Class, 'proto'); } // prepare prototype...
         
     | 
| 
      
 30 
     | 
    
         
            +
                if (initMixins) {
         
     | 
| 
      
 31 
     | 
    
         
            +
                  this.reopen.apply(this, initMixins);
         
     | 
| 
      
 32 
     | 
    
         
            +
                  initMixins = null;
         
     | 
| 
      
 33 
     | 
    
         
            +
                  rewatch(this); // ålways rewatch just in case
         
     | 
| 
      
 34 
     | 
    
         
            +
                  this.init.apply(this, arguments);
         
     | 
| 
      
 35 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 36 
     | 
    
         
            +
                  if (hasChains) {
         
     | 
| 
      
 37 
     | 
    
         
            +
                    rewatch(this);
         
     | 
| 
      
 38 
     | 
    
         
            +
                  } else {
         
     | 
| 
      
 39 
     | 
    
         
            +
                    this[SC.GUID_KEY] = undefined;
         
     | 
| 
      
 40 
     | 
    
         
            +
                  }
         
     | 
| 
      
 41 
     | 
    
         
            +
                  if (init===false) { init = this.init; } // cache for later instantiations
         
     | 
| 
      
 42 
     | 
    
         
            +
                  init.apply(this, arguments);
         
     | 
| 
      
 43 
     | 
    
         
            +
                }
         
     | 
| 
      
 44 
     | 
    
         
            +
              };
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
              Class.toString = classToString;
         
     | 
| 
      
 47 
     | 
    
         
            +
              Class._prototypeMixinDidChange = function() { isPrepared = false; };
         
     | 
| 
      
 48 
     | 
    
         
            +
              Class._initMixins = function(args) { initMixins = args; };
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
              SC.defineProperty(Class, 'proto', SC.computed(function() {
         
     | 
| 
      
 51 
     | 
    
         
            +
                if (!isPrepared) {
         
     | 
| 
      
 52 
     | 
    
         
            +
                  isPrepared = true;
         
     | 
| 
      
 53 
     | 
    
         
            +
                  Class.PrototypeMixin.applyPartial(Class.prototype);
         
     | 
| 
      
 54 
     | 
    
         
            +
                  hasChains = !!meta(Class.prototype, false).chains; // avoid rewatch
         
     | 
| 
      
 55 
     | 
    
         
            +
                }
         
     | 
| 
      
 56 
     | 
    
         
            +
                return this.prototype;
         
     | 
| 
      
 57 
     | 
    
         
            +
              }));
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
              return Class;
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
            }
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
            var CoreObject = makeCtor();
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
            CoreObject.PrototypeMixin = SC.Mixin.create({
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
              reopen: function() {
         
     | 
| 
      
 68 
     | 
    
         
            +
                SC.Mixin._apply(this, arguments, true);
         
     | 
| 
      
 69 
     | 
    
         
            +
                return this;
         
     | 
| 
      
 70 
     | 
    
         
            +
              },
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
              isInstance: true,
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
              init: function() {},
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
              isDestroyed: false,
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
              /**
         
     | 
| 
      
 79 
     | 
    
         
            +
                Destroys an object by setting the isDestroyed flag and removing its
         
     | 
| 
      
 80 
     | 
    
         
            +
                metadata, which effectively destroys observers and bindings.
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                If you try to set a property on a destroyed object, an exception will be
         
     | 
| 
      
 83 
     | 
    
         
            +
                raised.
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                Note that destruction is scheduled for the end of the run loop and does not
         
     | 
| 
      
 86 
     | 
    
         
            +
                happen immediately.
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
                @returns {SC.Object} receiver
         
     | 
| 
      
 89 
     | 
    
         
            +
              */
         
     | 
| 
      
 90 
     | 
    
         
            +
              destroy: function() {
         
     | 
| 
      
 91 
     | 
    
         
            +
                set(this, 'isDestroyed', true);
         
     | 
| 
      
 92 
     | 
    
         
            +
                SC.run.schedule('destroy', this, this._scheduledDestroy);
         
     | 
| 
      
 93 
     | 
    
         
            +
                return this;
         
     | 
| 
      
 94 
     | 
    
         
            +
              },
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
              /**
         
     | 
| 
      
 97 
     | 
    
         
            +
                Invoked by the run loop to actually destroy the object. This is
         
     | 
| 
      
 98 
     | 
    
         
            +
                scheduled for execution by the `destroy` method.
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
                @private
         
     | 
| 
      
 101 
     | 
    
         
            +
              */
         
     | 
| 
      
 102 
     | 
    
         
            +
              _scheduledDestroy: function() {
         
     | 
| 
      
 103 
     | 
    
         
            +
                this[SC.META_KEY] = null;
         
     | 
| 
      
 104 
     | 
    
         
            +
              },
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
      
 106 
     | 
    
         
            +
              bind: function(to, from) {
         
     | 
| 
      
 107 
     | 
    
         
            +
                if (!(from instanceof SC.Binding)) { from = SC.Binding.from(from); }
         
     | 
| 
      
 108 
     | 
    
         
            +
                from.to(to).connect(this);
         
     | 
| 
      
 109 
     | 
    
         
            +
                return from;
         
     | 
| 
      
 110 
     | 
    
         
            +
              },
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
              toString: function() {
         
     | 
| 
      
 113 
     | 
    
         
            +
                return '<'+this.constructor.toString()+':'+SC.guidFor(this)+'>';
         
     | 
| 
      
 114 
     | 
    
         
            +
              }
         
     | 
| 
      
 115 
     | 
    
         
            +
            });
         
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
            CoreObject.__super__ = null;
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
            var ClassMixin = SC.Mixin.create({
         
     | 
| 
      
 120 
     | 
    
         
            +
             
     | 
| 
      
 121 
     | 
    
         
            +
              ClassMixin: SC.required(),
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
              PrototypeMixin: SC.required(),
         
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
      
 125 
     | 
    
         
            +
              isClass: true,
         
     | 
| 
      
 126 
     | 
    
         
            +
             
     | 
| 
      
 127 
     | 
    
         
            +
              isMethod: false,
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
              extend: function() {
         
     | 
| 
      
 130 
     | 
    
         
            +
                var Class = makeCtor(), proto;
         
     | 
| 
      
 131 
     | 
    
         
            +
                Class.ClassMixin = SC.Mixin.create(this.ClassMixin);
         
     | 
| 
      
 132 
     | 
    
         
            +
                Class.PrototypeMixin = SC.Mixin.create(this.PrototypeMixin);
         
     | 
| 
      
 133 
     | 
    
         
            +
             
     | 
| 
      
 134 
     | 
    
         
            +
                Class.ClassMixin.ownerConstructor = Class;
         
     | 
| 
      
 135 
     | 
    
         
            +
                Class.PrototypeMixin.ownerConstructor = Class;
         
     | 
| 
      
 136 
     | 
    
         
            +
             
     | 
| 
      
 137 
     | 
    
         
            +
                var PrototypeMixin = Class.PrototypeMixin;
         
     | 
| 
      
 138 
     | 
    
         
            +
                PrototypeMixin.reopen.apply(PrototypeMixin, arguments);
         
     | 
| 
      
 139 
     | 
    
         
            +
             
     | 
| 
      
 140 
     | 
    
         
            +
                Class.superclass = this;
         
     | 
| 
      
 141 
     | 
    
         
            +
                Class.__super__  = this.prototype;
         
     | 
| 
      
 142 
     | 
    
         
            +
             
     | 
| 
      
 143 
     | 
    
         
            +
                proto = Class.prototype = o_create(this.prototype);
         
     | 
| 
      
 144 
     | 
    
         
            +
                proto.constructor = Class;
         
     | 
| 
      
 145 
     | 
    
         
            +
                SC.generateGuid(proto, 'sc');
         
     | 
| 
      
 146 
     | 
    
         
            +
                meta(proto).proto = proto; // this will disable observers on prototype
         
     | 
| 
      
 147 
     | 
    
         
            +
                SC.rewatch(proto); // setup watch chains if needed.
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
      
 149 
     | 
    
         
            +
             
     | 
| 
      
 150 
     | 
    
         
            +
                Class.subclasses = SC.Set ? new SC.Set() : null;
         
     | 
| 
      
 151 
     | 
    
         
            +
                if (this.subclasses) { this.subclasses.add(Class); }
         
     | 
| 
      
 152 
     | 
    
         
            +
             
     | 
| 
      
 153 
     | 
    
         
            +
                Class.ClassMixin.apply(Class);
         
     | 
| 
      
 154 
     | 
    
         
            +
                return Class;
         
     | 
| 
      
 155 
     | 
    
         
            +
              },
         
     | 
| 
      
 156 
     | 
    
         
            +
             
     | 
| 
      
 157 
     | 
    
         
            +
              create: function() {
         
     | 
| 
      
 158 
     | 
    
         
            +
                var C = this;
         
     | 
| 
      
 159 
     | 
    
         
            +
                if (arguments.length>0) { this._initMixins(arguments); }
         
     | 
| 
      
 160 
     | 
    
         
            +
                return new C();
         
     | 
| 
      
 161 
     | 
    
         
            +
              },
         
     | 
| 
      
 162 
     | 
    
         
            +
             
     | 
| 
      
 163 
     | 
    
         
            +
              reopen: function() {
         
     | 
| 
      
 164 
     | 
    
         
            +
                var PrototypeMixin = this.PrototypeMixin;
         
     | 
| 
      
 165 
     | 
    
         
            +
                PrototypeMixin.reopen.apply(PrototypeMixin, arguments);
         
     | 
| 
      
 166 
     | 
    
         
            +
                this._prototypeMixinDidChange();
         
     | 
| 
      
 167 
     | 
    
         
            +
                return this;
         
     | 
| 
      
 168 
     | 
    
         
            +
              },
         
     | 
| 
      
 169 
     | 
    
         
            +
             
     | 
| 
      
 170 
     | 
    
         
            +
              reopenClass: function() {
         
     | 
| 
      
 171 
     | 
    
         
            +
                var ClassMixin = this.ClassMixin;
         
     | 
| 
      
 172 
     | 
    
         
            +
                ClassMixin.reopen.apply(ClassMixin, arguments);
         
     | 
| 
      
 173 
     | 
    
         
            +
                SC.Mixin._apply(this, arguments, false);
         
     | 
| 
      
 174 
     | 
    
         
            +
                return this;
         
     | 
| 
      
 175 
     | 
    
         
            +
              },
         
     | 
| 
      
 176 
     | 
    
         
            +
             
     | 
| 
      
 177 
     | 
    
         
            +
              detect: function(obj) {
         
     | 
| 
      
 178 
     | 
    
         
            +
                if ('function' !== typeof obj) { return false; }
         
     | 
| 
      
 179 
     | 
    
         
            +
                while(obj) {
         
     | 
| 
      
 180 
     | 
    
         
            +
                  if (obj===this) { return true; }
         
     | 
| 
      
 181 
     | 
    
         
            +
                  obj = obj.superclass;
         
     | 
| 
      
 182 
     | 
    
         
            +
                }
         
     | 
| 
      
 183 
     | 
    
         
            +
                return false;
         
     | 
| 
      
 184 
     | 
    
         
            +
              }
         
     | 
| 
      
 185 
     | 
    
         
            +
             
     | 
| 
      
 186 
     | 
    
         
            +
            });
         
     | 
| 
      
 187 
     | 
    
         
            +
             
     | 
| 
      
 188 
     | 
    
         
            +
            CoreObject.ClassMixin = ClassMixin;
         
     | 
| 
      
 189 
     | 
    
         
            +
            ClassMixin.apply(CoreObject);
         
     | 
| 
      
 190 
     | 
    
         
            +
             
     | 
| 
      
 191 
     | 
    
         
            +
            SC.CoreObject = CoreObject;
         
     | 
| 
      
 192 
     | 
    
         
            +
             
     | 
| 
      
 193 
     | 
    
         
            +
             
     | 
| 
      
 194 
     | 
    
         
            +
             
     | 
| 
      
 195 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,218 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            // ==========================================================================
         
     | 
| 
      
 2 
     | 
    
         
            +
            // Project:  SproutCore Runtime
         
     | 
| 
      
 3 
     | 
    
         
            +
            // Copyright: ©2011 Strobe Inc. and contributors.
         
     | 
| 
      
 4 
     | 
    
         
            +
            // License:   Licensed under MIT license (see license.js)
         
     | 
| 
      
 5 
     | 
    
         
            +
            // ==========================================================================
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            require('sproutcore-runtime/system/object');
         
     | 
| 
      
 8 
     | 
    
         
            +
            require('sproutcore-runtime/mixins/array');
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            var set = SC.set, get = SC.get, guidFor = SC.guidFor;
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            var EachArray = SC.Object.extend(SC.Array, {
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              init: function(content, keyName, owner) {
         
     | 
| 
      
 17 
     | 
    
         
            +
                this._super();
         
     | 
| 
      
 18 
     | 
    
         
            +
                this._keyName = keyName;
         
     | 
| 
      
 19 
     | 
    
         
            +
                this._owner   = owner;
         
     | 
| 
      
 20 
     | 
    
         
            +
                this._content = content;
         
     | 
| 
      
 21 
     | 
    
         
            +
              },
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              objectAt: function(idx) {
         
     | 
| 
      
 24 
     | 
    
         
            +
                var item = this._content.objectAt(idx);
         
     | 
| 
      
 25 
     | 
    
         
            +
                return item && get(item, this._keyName);
         
     | 
| 
      
 26 
     | 
    
         
            +
              },
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
              length: function() {
         
     | 
| 
      
 29 
     | 
    
         
            +
                var content = this._content;
         
     | 
| 
      
 30 
     | 
    
         
            +
                return content ? get(content, 'length') : 0;
         
     | 
| 
      
 31 
     | 
    
         
            +
              }.property('[]').cacheable()
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            });
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            var IS_OBSERVER = /^.+:(before|change)$/;
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
            function addObserverForContentKey(content, keyName, proxy, idx, loc) {
         
     | 
| 
      
 38 
     | 
    
         
            +
              var objects = proxy._objects, guid;
         
     | 
| 
      
 39 
     | 
    
         
            +
              if (!objects) objects = proxy._objects = {};
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
              while(--loc>=idx) {
         
     | 
| 
      
 42 
     | 
    
         
            +
                var item = content.objectAt(loc);
         
     | 
| 
      
 43 
     | 
    
         
            +
                if (item) {
         
     | 
| 
      
 44 
     | 
    
         
            +
                  SC.addBeforeObserver(item, keyName, proxy, 'contentKeyWillChange');
         
     | 
| 
      
 45 
     | 
    
         
            +
                  SC.addObserver(item, keyName, proxy, 'contentKeyDidChange');
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                  // keep track of the indicies each item was found at so we can map
         
     | 
| 
      
 48 
     | 
    
         
            +
                  // it back when the obj changes.
         
     | 
| 
      
 49 
     | 
    
         
            +
                  guid = guidFor(item);
         
     | 
| 
      
 50 
     | 
    
         
            +
                  if (!objects[guid]) objects[guid] = [];
         
     | 
| 
      
 51 
     | 
    
         
            +
                  objects[guid].push(loc);
         
     | 
| 
      
 52 
     | 
    
         
            +
                }
         
     | 
| 
      
 53 
     | 
    
         
            +
              }
         
     | 
| 
      
 54 
     | 
    
         
            +
            }
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
            function removeObserverForContentKey(content, keyName, proxy, idx, loc) {
         
     | 
| 
      
 57 
     | 
    
         
            +
              var objects = proxy._objects;
         
     | 
| 
      
 58 
     | 
    
         
            +
              if (!objects) objects = proxy._objects = {};
         
     | 
| 
      
 59 
     | 
    
         
            +
              var indicies, guid;
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
              while(--loc>=idx) {
         
     | 
| 
      
 62 
     | 
    
         
            +
                var item = content.objectAt(loc);
         
     | 
| 
      
 63 
     | 
    
         
            +
                if (item) {
         
     | 
| 
      
 64 
     | 
    
         
            +
                  SC.removeBeforeObserver(item, keyName, proxy, 'contentKeyWillChange');
         
     | 
| 
      
 65 
     | 
    
         
            +
                  SC.removeObserver(item, keyName, proxy, 'contentKeyDidChange');
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                  guid = guidFor(item);
         
     | 
| 
      
 68 
     | 
    
         
            +
                  indicies = objects[guid];
         
     | 
| 
      
 69 
     | 
    
         
            +
                  indicies[indicies.indexOf(loc)] = null;
         
     | 
| 
      
 70 
     | 
    
         
            +
                }
         
     | 
| 
      
 71 
     | 
    
         
            +
              }
         
     | 
| 
      
 72 
     | 
    
         
            +
            }
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
            /**
         
     | 
| 
      
 75 
     | 
    
         
            +
              @private
         
     | 
| 
      
 76 
     | 
    
         
            +
              @class
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
              This is the object instance returned when you get the @each property on an
         
     | 
| 
      
 79 
     | 
    
         
            +
              array.  It uses the unknownProperty handler to automatically create
         
     | 
| 
      
 80 
     | 
    
         
            +
              EachArray instances for property names.
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
              @extends SC.Object
         
     | 
| 
      
 83 
     | 
    
         
            +
            */
         
     | 
| 
      
 84 
     | 
    
         
            +
            SC.EachProxy = SC.Object.extend({
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
              init: function(content) {
         
     | 
| 
      
 87 
     | 
    
         
            +
                this._super();
         
     | 
| 
      
 88 
     | 
    
         
            +
                this._content = content;
         
     | 
| 
      
 89 
     | 
    
         
            +
                content.addArrayObserver(this);
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                // in case someone is already observing some keys make sure they are
         
     | 
| 
      
 92 
     | 
    
         
            +
                // added
         
     | 
| 
      
 93 
     | 
    
         
            +
                SC.watchedEvents(this).forEach(function(eventName) {
         
     | 
| 
      
 94 
     | 
    
         
            +
                  this.didAddListener(eventName);
         
     | 
| 
      
 95 
     | 
    
         
            +
                }, this);
         
     | 
| 
      
 96 
     | 
    
         
            +
              },
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
              /**
         
     | 
| 
      
 99 
     | 
    
         
            +
                You can directly access mapped properties by simply requesting them.
         
     | 
| 
      
 100 
     | 
    
         
            +
                The unknownProperty handler will generate an EachArray of each item.
         
     | 
| 
      
 101 
     | 
    
         
            +
              */
         
     | 
| 
      
 102 
     | 
    
         
            +
              unknownProperty: function(keyName, value) {
         
     | 
| 
      
 103 
     | 
    
         
            +
                var ret;
         
     | 
| 
      
 104 
     | 
    
         
            +
                ret = new EachArray(this._content, keyName, this);
         
     | 
| 
      
 105 
     | 
    
         
            +
                new SC.Descriptor().setup(this, keyName, ret);
         
     | 
| 
      
 106 
     | 
    
         
            +
                this.beginObservingContentKey(keyName);
         
     | 
| 
      
 107 
     | 
    
         
            +
                return ret;
         
     | 
| 
      
 108 
     | 
    
         
            +
              },
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
              // ..........................................................
         
     | 
| 
      
 111 
     | 
    
         
            +
              // ARRAY CHANGES
         
     | 
| 
      
 112 
     | 
    
         
            +
              // Invokes whenever the content array itself changes.
         
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
      
 114 
     | 
    
         
            +
              arrayWillChange: function(content, idx, removedCnt, addedCnt) {
         
     | 
| 
      
 115 
     | 
    
         
            +
                var keys = this._keys, key, array, lim;
         
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
                lim = removedCnt>0 ? idx+removedCnt : -1;
         
     | 
| 
      
 118 
     | 
    
         
            +
                SC.beginPropertyChanges(this);
         
     | 
| 
      
 119 
     | 
    
         
            +
                for(key in keys) {
         
     | 
| 
      
 120 
     | 
    
         
            +
                  if (!keys.hasOwnProperty(key)) continue;
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
      
 122 
     | 
    
         
            +
                  if (lim>0) removeObserverForContentKey(content, key, this, idx, lim);
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
                  array = get(this, key);
         
     | 
| 
      
 125 
     | 
    
         
            +
                  SC.propertyWillChange(this, key);
         
     | 
| 
      
 126 
     | 
    
         
            +
                  if (array) array.arrayContentWillChange(idx, removedCnt, addedCnt);
         
     | 
| 
      
 127 
     | 
    
         
            +
                }
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
                SC.propertyWillChange(this._content, '@each');
         
     | 
| 
      
 130 
     | 
    
         
            +
                SC.endPropertyChanges(this);
         
     | 
| 
      
 131 
     | 
    
         
            +
              },
         
     | 
| 
      
 132 
     | 
    
         
            +
             
     | 
| 
      
 133 
     | 
    
         
            +
              arrayDidChange: function(content, idx, removedCnt, addedCnt) {
         
     | 
| 
      
 134 
     | 
    
         
            +
                var keys = this._keys, key, array, lim;
         
     | 
| 
      
 135 
     | 
    
         
            +
             
     | 
| 
      
 136 
     | 
    
         
            +
                lim = addedCnt>0 ? idx+addedCnt : -1;
         
     | 
| 
      
 137 
     | 
    
         
            +
                SC.beginPropertyChanges(this);
         
     | 
| 
      
 138 
     | 
    
         
            +
                for(key in keys) {
         
     | 
| 
      
 139 
     | 
    
         
            +
                  if (!keys.hasOwnProperty(key)) continue;
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
      
 141 
     | 
    
         
            +
                  if (lim>0) addObserverForContentKey(content, key, this, idx, lim);
         
     | 
| 
      
 142 
     | 
    
         
            +
             
     | 
| 
      
 143 
     | 
    
         
            +
                  array = get(this, key);
         
     | 
| 
      
 144 
     | 
    
         
            +
                  if (array) array.arrayContentDidChange(idx, removedCnt, addedCnt);
         
     | 
| 
      
 145 
     | 
    
         
            +
                  SC.propertyDidChange(this, key);
         
     | 
| 
      
 146 
     | 
    
         
            +
                }
         
     | 
| 
      
 147 
     | 
    
         
            +
                SC.propertyDidChange(this._content, '@each');
         
     | 
| 
      
 148 
     | 
    
         
            +
                SC.endPropertyChanges(this);
         
     | 
| 
      
 149 
     | 
    
         
            +
              },
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
      
 151 
     | 
    
         
            +
              // ..........................................................
         
     | 
| 
      
 152 
     | 
    
         
            +
              // LISTEN FOR NEW OBSERVERS AND OTHER EVENT LISTENERS
         
     | 
| 
      
 153 
     | 
    
         
            +
              // Start monitoring keys based on who is listening...
         
     | 
| 
      
 154 
     | 
    
         
            +
             
     | 
| 
      
 155 
     | 
    
         
            +
              didAddListener: function(eventName) {
         
     | 
| 
      
 156 
     | 
    
         
            +
                if (IS_OBSERVER.test(eventName)) {
         
     | 
| 
      
 157 
     | 
    
         
            +
                  this.beginObservingContentKey(eventName.slice(0, -7));
         
     | 
| 
      
 158 
     | 
    
         
            +
                }
         
     | 
| 
      
 159 
     | 
    
         
            +
              },
         
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
      
 161 
     | 
    
         
            +
              didRemoveListener: function(eventName) {
         
     | 
| 
      
 162 
     | 
    
         
            +
                if (IS_OBSERVER.test(eventName)) {
         
     | 
| 
      
 163 
     | 
    
         
            +
                  this.stopObservingContentKey(eventName.slice(0, -7));
         
     | 
| 
      
 164 
     | 
    
         
            +
                }
         
     | 
| 
      
 165 
     | 
    
         
            +
              },
         
     | 
| 
      
 166 
     | 
    
         
            +
             
     | 
| 
      
 167 
     | 
    
         
            +
              // ..........................................................
         
     | 
| 
      
 168 
     | 
    
         
            +
              // CONTENT KEY OBSERVING
         
     | 
| 
      
 169 
     | 
    
         
            +
              // Actual watch keys on the source content.
         
     | 
| 
      
 170 
     | 
    
         
            +
             
     | 
| 
      
 171 
     | 
    
         
            +
              beginObservingContentKey: function(keyName) {
         
     | 
| 
      
 172 
     | 
    
         
            +
                var keys = this._keys;
         
     | 
| 
      
 173 
     | 
    
         
            +
                if (!keys) keys = this._keys = {};
         
     | 
| 
      
 174 
     | 
    
         
            +
                if (!keys[keyName]) {
         
     | 
| 
      
 175 
     | 
    
         
            +
                  keys[keyName] = 1;
         
     | 
| 
      
 176 
     | 
    
         
            +
                  var content = this._content,
         
     | 
| 
      
 177 
     | 
    
         
            +
                      len = get(content, 'length');
         
     | 
| 
      
 178 
     | 
    
         
            +
                  addObserverForContentKey(content, keyName, this, 0, len);
         
     | 
| 
      
 179 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 180 
     | 
    
         
            +
                  keys[keyName]++;
         
     | 
| 
      
 181 
     | 
    
         
            +
                }
         
     | 
| 
      
 182 
     | 
    
         
            +
              },
         
     | 
| 
      
 183 
     | 
    
         
            +
             
     | 
| 
      
 184 
     | 
    
         
            +
              stopObservingContentKey: function(keyName) {
         
     | 
| 
      
 185 
     | 
    
         
            +
                var keys = this._keys;
         
     | 
| 
      
 186 
     | 
    
         
            +
                if (keys && (keys[keyName]>0) && (--keys[keyName]<=0)) {
         
     | 
| 
      
 187 
     | 
    
         
            +
                  var content = this._content,
         
     | 
| 
      
 188 
     | 
    
         
            +
                      len     = get(content, 'length');
         
     | 
| 
      
 189 
     | 
    
         
            +
                  removeObserverForContentKey(content, keyName, this, 0, len);
         
     | 
| 
      
 190 
     | 
    
         
            +
                }
         
     | 
| 
      
 191 
     | 
    
         
            +
              },
         
     | 
| 
      
 192 
     | 
    
         
            +
             
     | 
| 
      
 193 
     | 
    
         
            +
              contentKeyWillChange: function(obj, keyName) {
         
     | 
| 
      
 194 
     | 
    
         
            +
                // notify array.
         
     | 
| 
      
 195 
     | 
    
         
            +
                var indexes = this._objects[guidFor(obj)],
         
     | 
| 
      
 196 
     | 
    
         
            +
                    array   = get(this, keyName),
         
     | 
| 
      
 197 
     | 
    
         
            +
                    len = array && indexes ? indexes.length : 0, idx;
         
     | 
| 
      
 198 
     | 
    
         
            +
             
     | 
| 
      
 199 
     | 
    
         
            +
                for(idx=0;idx<len;idx++) {
         
     | 
| 
      
 200 
     | 
    
         
            +
                  array.arrayContentWillChange(indexes[idx], 1, 1);
         
     | 
| 
      
 201 
     | 
    
         
            +
                }
         
     | 
| 
      
 202 
     | 
    
         
            +
              },
         
     | 
| 
      
 203 
     | 
    
         
            +
             
     | 
| 
      
 204 
     | 
    
         
            +
              contentKeyDidChange: function(obj, keyName) {
         
     | 
| 
      
 205 
     | 
    
         
            +
                // notify array.
         
     | 
| 
      
 206 
     | 
    
         
            +
                var indexes = this._objects[guidFor(obj)],
         
     | 
| 
      
 207 
     | 
    
         
            +
                    array   = get(this, keyName),
         
     | 
| 
      
 208 
     | 
    
         
            +
                    len = array && indexes ? indexes.length : 0, idx;
         
     | 
| 
      
 209 
     | 
    
         
            +
             
     | 
| 
      
 210 
     | 
    
         
            +
                for(idx=0;idx<len;idx++) {
         
     | 
| 
      
 211 
     | 
    
         
            +
                  array.arrayContentDidChange(indexes[idx], 1, 1);
         
     | 
| 
      
 212 
     | 
    
         
            +
                }
         
     | 
| 
      
 213 
     | 
    
         
            +
             
     | 
| 
      
 214 
     | 
    
         
            +
                SC.propertyDidChange(this, keyName);
         
     | 
| 
      
 215 
     | 
    
         
            +
              }
         
     | 
| 
      
 216 
     | 
    
         
            +
             
     | 
| 
      
 217 
     | 
    
         
            +
            });
         
     | 
| 
      
 218 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,139 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            // ==========================================================================
         
     | 
| 
      
 2 
     | 
    
         
            +
            // Project:  SproutCore Runtime
         
     | 
| 
      
 3 
     | 
    
         
            +
            // Copyright: ©2011 Strobe Inc. and contributors.
         
     | 
| 
      
 4 
     | 
    
         
            +
            // License:   Licensed under MIT license (see license.js)
         
     | 
| 
      
 5 
     | 
    
         
            +
            // ==========================================================================
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            require('sproutcore-runtime/mixins/observable');
         
     | 
| 
      
 9 
     | 
    
         
            +
            require('sproutcore-runtime/mixins/mutable_array');
         
     | 
| 
      
 10 
     | 
    
         
            +
            require('sproutcore-runtime/mixins/copyable');
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            var get = SC.get, set = SC.set;
         
     | 
| 
      
 15 
     | 
    
         
            +
              
         
     | 
| 
      
 16 
     | 
    
         
            +
            // Add SC.Array to Array.prototype.  Remove methods with native 
         
     | 
| 
      
 17 
     | 
    
         
            +
            // implementations and supply some more optimized versions of generic methods
         
     | 
| 
      
 18 
     | 
    
         
            +
            // because they are so common.
         
     | 
| 
      
 19 
     | 
    
         
            +
            var NativeArray = SC.Mixin.create(SC.MutableArray, SC.Observable, SC.Copyable, {
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
              // because length is a built-in property we need to know to just get the 
         
     | 
| 
      
 22 
     | 
    
         
            +
              // original property.
         
     | 
| 
      
 23 
     | 
    
         
            +
              get: function(key) {
         
     | 
| 
      
 24 
     | 
    
         
            +
                if (key==='length') return this.length;
         
     | 
| 
      
 25 
     | 
    
         
            +
                else if ('number' === typeof key) return this[key];
         
     | 
| 
      
 26 
     | 
    
         
            +
                else return this._super(key);  
         
     | 
| 
      
 27 
     | 
    
         
            +
              },
         
     | 
| 
      
 28 
     | 
    
         
            +
              
         
     | 
| 
      
 29 
     | 
    
         
            +
              objectAt: function(idx) {
         
     | 
| 
      
 30 
     | 
    
         
            +
                return this[idx];
         
     | 
| 
      
 31 
     | 
    
         
            +
              },
         
     | 
| 
      
 32 
     | 
    
         
            +
                
         
     | 
| 
      
 33 
     | 
    
         
            +
              // primitive for array support.
         
     | 
| 
      
 34 
     | 
    
         
            +
              replace: function(idx, amt, objects) {
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                if (this.isFrozen) throw SC.FROZEN_ERROR ;
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                // if we replaced exactly the same number of items, then pass only the
         
     | 
| 
      
 39 
     | 
    
         
            +
                // replaced range.  Otherwise, pass the full remaining array length
         
     | 
| 
      
 40 
     | 
    
         
            +
                // since everything has shifted
         
     | 
| 
      
 41 
     | 
    
         
            +
                var len = objects ? get(objects, 'length') : 0;
         
     | 
| 
      
 42 
     | 
    
         
            +
                if (this.isBilly) { debugger; }
         
     | 
| 
      
 43 
     | 
    
         
            +
                this.arrayContentWillChange(idx, amt, len);
         
     | 
| 
      
 44 
     | 
    
         
            +
                
         
     | 
| 
      
 45 
     | 
    
         
            +
                if (!objects || objects.length === 0) {
         
     | 
| 
      
 46 
     | 
    
         
            +
                  this.splice(idx, amt) ;
         
     | 
| 
      
 47 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 48 
     | 
    
         
            +
                  var args = [idx, amt].concat(objects) ;
         
     | 
| 
      
 49 
     | 
    
         
            +
                  this.splice.apply(this,args) ;
         
     | 
| 
      
 50 
     | 
    
         
            +
                }
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                this.arrayContentDidChange(idx, amt, len);
         
     | 
| 
      
 53 
     | 
    
         
            +
                return this ;
         
     | 
| 
      
 54 
     | 
    
         
            +
              },
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
              // If you ask for an unknown property, then try to collect the value
         
     | 
| 
      
 57 
     | 
    
         
            +
              // from member items.
         
     | 
| 
      
 58 
     | 
    
         
            +
              unknownProperty: function(key, value) {
         
     | 
| 
      
 59 
     | 
    
         
            +
                var ret;// = this.reducedProperty(key, value) ;
         
     | 
| 
      
 60 
     | 
    
         
            +
                if ((value !== undefined) && ret === undefined) {
         
     | 
| 
      
 61 
     | 
    
         
            +
                  ret = this[key] = value;
         
     | 
| 
      
 62 
     | 
    
         
            +
                }
         
     | 
| 
      
 63 
     | 
    
         
            +
                return ret ;
         
     | 
| 
      
 64 
     | 
    
         
            +
              },
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
              // If browser did not implement indexOf natively, then override with
         
     | 
| 
      
 67 
     | 
    
         
            +
              // specialized version
         
     | 
| 
      
 68 
     | 
    
         
            +
              indexOf: function(object, startAt) {
         
     | 
| 
      
 69 
     | 
    
         
            +
                var idx, len = this.length;
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                if (startAt === undefined) startAt = 0;
         
     | 
| 
      
 72 
     | 
    
         
            +
                else startAt = (startAt < 0) ? Math.ceil(startAt) : Math.floor(startAt);
         
     | 
| 
      
 73 
     | 
    
         
            +
                if (startAt < 0) startAt += len;
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                for(idx=startAt;idx<len;idx++) {
         
     | 
| 
      
 76 
     | 
    
         
            +
                  if (this[idx] === object) return idx ;
         
     | 
| 
      
 77 
     | 
    
         
            +
                }
         
     | 
| 
      
 78 
     | 
    
         
            +
                return -1;
         
     | 
| 
      
 79 
     | 
    
         
            +
              },
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
              lastIndexOf: function(object, startAt) {
         
     | 
| 
      
 82 
     | 
    
         
            +
                var idx, len = this.length;
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                if (startAt === undefined) startAt = len-1;
         
     | 
| 
      
 85 
     | 
    
         
            +
                else startAt = (startAt < 0) ? Math.ceil(startAt) : Math.floor(startAt);
         
     | 
| 
      
 86 
     | 
    
         
            +
                if (startAt < 0) startAt += len;
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
                for(idx=startAt;idx>=0;idx--) {
         
     | 
| 
      
 89 
     | 
    
         
            +
                  if (this[idx] === object) return idx ;
         
     | 
| 
      
 90 
     | 
    
         
            +
                }
         
     | 
| 
      
 91 
     | 
    
         
            +
                return -1;
         
     | 
| 
      
 92 
     | 
    
         
            +
              },
         
     | 
| 
      
 93 
     | 
    
         
            +
              
         
     | 
| 
      
 94 
     | 
    
         
            +
              copy: function() {
         
     | 
| 
      
 95 
     | 
    
         
            +
                return this.slice();
         
     | 
| 
      
 96 
     | 
    
         
            +
              }
         
     | 
| 
      
 97 
     | 
    
         
            +
            });
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
            // Remove any methods implemented natively so we don't override them
         
     | 
| 
      
 100 
     | 
    
         
            +
            var ignore = ['length'];
         
     | 
| 
      
 101 
     | 
    
         
            +
            NativeArray.keys().forEach(function(methodName) {
         
     | 
| 
      
 102 
     | 
    
         
            +
              if (Array.prototype[methodName]) ignore.push(methodName);
         
     | 
| 
      
 103 
     | 
    
         
            +
            });
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
            if (ignore.length>0) {
         
     | 
| 
      
 106 
     | 
    
         
            +
              NativeArray = NativeArray.without.apply(NativeArray, ignore);
         
     | 
| 
      
 107 
     | 
    
         
            +
            }
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
      
 109 
     | 
    
         
            +
            /**
         
     | 
| 
      
 110 
     | 
    
         
            +
              The NativeArray mixin contains the properties needed to to make the native
         
     | 
| 
      
 111 
     | 
    
         
            +
              Array support SC.MutableArray and all of its dependent APIs.  Unless you 
         
     | 
| 
      
 112 
     | 
    
         
            +
              have SC.EXTEND_PROTOTYPES set to false, this will be applied automatically.
         
     | 
| 
      
 113 
     | 
    
         
            +
              Otherwise you can apply the mixin at anytime by calling 
         
     | 
| 
      
 114 
     | 
    
         
            +
              `SC.NativeArray.activate`.
         
     | 
| 
      
 115 
     | 
    
         
            +
              
         
     | 
| 
      
 116 
     | 
    
         
            +
              @namespace
         
     | 
| 
      
 117 
     | 
    
         
            +
              @extends SC.MutableArray
         
     | 
| 
      
 118 
     | 
    
         
            +
              @extends SC.Array
         
     | 
| 
      
 119 
     | 
    
         
            +
              @extends SC.Enumerable
         
     | 
| 
      
 120 
     | 
    
         
            +
              @extends SC.MutableEnumerable
         
     | 
| 
      
 121 
     | 
    
         
            +
              @extends SC.Copyable
         
     | 
| 
      
 122 
     | 
    
         
            +
              @extends SC.Freezable
         
     | 
| 
      
 123 
     | 
    
         
            +
            */
         
     | 
| 
      
 124 
     | 
    
         
            +
            SC.NativeArray = NativeArray;
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
            /**
         
     | 
| 
      
 127 
     | 
    
         
            +
              Activates the mixin on the Array.prototype if not already applied.  Calling
         
     | 
| 
      
 128 
     | 
    
         
            +
              this method more than once is safe.
         
     | 
| 
      
 129 
     | 
    
         
            +
              
         
     | 
| 
      
 130 
     | 
    
         
            +
              @returns {void}
         
     | 
| 
      
 131 
     | 
    
         
            +
            */
         
     | 
| 
      
 132 
     | 
    
         
            +
            SC.NativeArray.activate = function() {
         
     | 
| 
      
 133 
     | 
    
         
            +
              NativeArray.apply(Array.prototype);
         
     | 
| 
      
 134 
     | 
    
         
            +
            };
         
     | 
| 
      
 135 
     | 
    
         
            +
             
     | 
| 
      
 136 
     | 
    
         
            +
            if (SC.EXTEND_PROTOTYPES) SC.NativeArray.activate();
         
     | 
| 
      
 137 
     | 
    
         
            +
             
     | 
| 
      
 138 
     | 
    
         
            +
             
     | 
| 
      
 139 
     | 
    
         
            +
             
     |