docs: function meta(obj, writable) {
  
        var ret = obj['__ember_meta__'];
        if (writable===false) return ret || EMPTY_META;
  
        if (!ret) {
          if (canDefineNonEnumerableProperties) o_defineProperty(obj, '__ember_meta__', META_DESC);
  
          ret = new Meta(obj);
  
          
            if (hasPropertyAccessors) {
              ret.values = {};
            }
          
  
          obj['__ember_meta__'] = ret;
  
          // make sure we don't accidentally try to create constructor like desc
          ret.descs.constructor = null;
  
        } else if (ret.source !== obj) {
          if (canDefineNonEnumerableProperties) o_defineProperty(obj, '__ember_meta__', META_DESC);
  
          ret = o_create(ret);
          ret.descs     = o_create(ret.descs);
          ret.watching  = o_create(ret.watching);
          ret.cache     = {};
          ret.cacheMeta = {};
          ret.source    = obj;
  
          
            if (hasPropertyAccessors) {
              ret.values = o_create(ret.values);
            }
          
  
          obj['__ember_meta__'] = ret;
        }
        return ret;
      }