code: function propertyDidChange(obj, keyName) {
        var m = obj['__ember_meta__'];
        var watching = (m && m.watching[keyName] > 0) || keyName === 'length';
        var proto = m && m.proto;
        var desc = m && m.descs[keyName];
  
        if (proto === obj) { return; }
  
        // shouldn't this mean that we're watching this key?
        if (desc && desc.didChange) { desc.didChange(obj, keyName); }
        if (!watching && keyName !== 'length') { return; }
  
        if (m && m.deps && m.deps[keyName]) {
          dependentKeysDidChange(obj, keyName, m);
        }
  
        chainsDidChange(obj, keyName, m, false);
        notifyObservers(obj, keyName);
      }
docs: This function is called just after an object property has changed.
  It will notify any observers and clear caches among other things.
  
  Normally you will not need to call this method directly but if for some
  reason you can't directly watch a property you can invoke this method
  manually along with `Ember.propertyWillChange()` which you should call just
  before the property value changes.
  
  @method propertyDidChange
  @for Ember
  @param {Object} obj The object with the property that will change
  @param {String} keyName The property key (or path) that will change.
  @return {void}