docs: function propertyDidChange(obj, keyName) {
      var m = _emberMetalMeta.peekMeta(obj);
      var watching = m && m.peekWatching(keyName) > 0 || keyName === 'length';
      var proto = m && m.proto;
      var possibleDesc = obj[keyName];
      var desc = possibleDesc !== null && typeof possibleDesc === 'object' && possibleDesc.isDescriptor ? possibleDesc : undefined;
  
      if (proto === obj) {
        return;
      }
  
      // shouldn't this mean that we're watching this key?
      if (desc && desc.didChange) {
        desc.didChange(obj, keyName);
      }
  
      if (obj[PROPERTY_DID_CHANGE]) {
        obj[PROPERTY_DID_CHANGE](keyName);
      }
  
      if (!watching && keyName !== 'length') {
        return;
      }
  
      if (m && m.hasDeps(keyName)) {
        dependentKeysDidChange(obj, keyName, m);
      }
  
      chainsDidChange(obj, keyName, m, false);
      notifyObservers(obj, keyName);
    }