code: function copy(obj, deep) {
      // fast paths
      if ('object' !== typeof obj || obj === null) {
        return obj; // can't copy primitives
      }
  
      if (_emberRuntimeMixinsCopyable.default && _emberRuntimeMixinsCopyable.default.detect(obj)) {
        return obj.copy(deep);
      }
  
      return _copy(obj, deep, deep ? [] : null, deep ? [] : null);
    }
docs: Creates a shallow copy of the passed object. A deep copy of the object is
  returned if the optional `deep` argument is `true`.
  
  If the passed object implements the `Ember.Copyable` interface, then this
  function will delegate to the object's `copy()` method and return the
  result. See `Ember.Copyable` for further details.
  
  For primitive values (which are immutable in JavaScript), the passed object
  is simply returned.
  
  @method copy
  @for Ember
  @param {Object} obj The object to clone
  @param {Boolean} [deep=false] If true, a deep copy of the object is made.
  @return {Object} The copied object
  @public