code: function watch(obj, _keyPath, m) {
        // can't watch length on Array - it is special...
        if (_keyPath === 'length' && typeOf(obj) === 'array') { return; }
  
        if (!isPath(_keyPath)) {
          watchKey(obj, _keyPath, m);
        } else {
          watchPath(obj, _keyPath, m);
        }
      }
docs: Starts watching a property on an object. Whenever the property changes,
  invokes `Ember.propertyWillChange` and `Ember.propertyDidChange`. This is the
  primitive used by observers and dependent keys; usually you will never call
  this method directly but instead use higher level methods like
  `Ember.addObserver()`
  
  @private
  @method watch
  @for Ember
  @param obj
  @param {String} keyName