docs: function(watchExp, listener, objectEquality, prettyPrintExpression) {
          var get = $parse(watchExp);
  
          if (get.$$watchDelegate) {
            return get.$$watchDelegate(this, listener, objectEquality, get, watchExp);
          }
          var scope = this,
              array = scope.$$watchers,
              watcher = {
                fn: listener,
                last: initWatchVal,
                get: get,
                exp: prettyPrintExpression || watchExp,
                eq: !!objectEquality
              };
  
          lastDirtyWatch = null;
  
          if (!isFunction(listener)) {
            watcher.fn = noop;
          }
  
          if (!array) {
            array = scope.$$watchers = [];
          }
          // we use unshift since we use a while loop in $digest for speed.
          // the while loop reads in reverse order.
          array.unshift(watcher);
          incrementWatchersCount(this, 1);
  
          return function deregisterWatch() {
            if (arrayRemove(array, watcher) >= 0) {
              incrementWatchersCount(scope, -1);
            }
            lastDirtyWatch = null;
          };
        }