code: function isArray(obj) {
        var modulePath, type;
  
        if (typeof EmberArray === "undefined") {
          modulePath = 'ember-runtime/mixins/array';
          if (Ember.__loader.registry[modulePath]) {
            EmberArray = Ember.__loader.require(modulePath)['default'];
          }
        }
  
        if (!obj || obj.setInterval) { return false; }
        if (Array.isArray && Array.isArray(obj)) { return true; }
        if (EmberArray && EmberArray.detect(obj)) { return true; }
  
        type = typeOf(obj);
        if ('array' === type) { return true; }
        if ((obj.length !== undefined) && 'object' === type) { return true; }
        return false;
      }
docs: Returns true if the passed object is an array or Array-like.
  
  Ember Array Protocol:
  
  - the object has an objectAt property
  - the object is a native Array
  - the object is an Object, and has a length property
  
  Unlike `Ember.typeOf` this method returns true even if the passed object is
  not formally array but appears to be array-like (i.e. implements `Ember.Array`)
  
  ```javascript
  Ember.isArray();                                          // false
  Ember.isArray([]);                                        // true
  Ember.isArray(Ember.ArrayProxy.create({ content: [] }));  // true
  ```
  
  @method isArray
  @for Ember
  @param {Object} obj The object to test
  @return {Boolean} true if the passed object is an array or Array-like
   ES6TODO: Move up to runtime? This is only use in ember-metal by concatenatedProperties