function watchProps (watchDepth, scope, watchExpressions, listener){
    var supportsWatchCollection = angular.isFunction(scope.$watchCollection);
    var supportsWatchGroup = angular.isFunction(scope.$watchGroup);

    var watchGroupExpressions = [];
    watchExpressions.forEach(function(expr){
      var actualExpr = getPropExpression(expr);
      var exprWatchDepth = getPropWatchDepth(watchDepth, expr);

      if (exprWatchDepth === 'collection' && supportsWatchCollection) {
        scope.$watchCollection(actualExpr, listener);
      } else if (exprWatchDepth === 'reference' && supportsWatchGroup) {
        watchGroupExpressions.push(actualExpr);
      } else {
        scope.$watch(actualExpr, listener, (exprWatchDepth !== 'reference'));
      }
    });

    if (watchGroupExpressions.length) {
      scope.$watchGroup(watchGroupExpressions, listener);
    }
  }
@param watchDepth (value of HTML watch-depth attribute)
@param scope (angular scope)

Uses the watchDepth attribute to determine how to watch props on scope.
If watchDepth attribute is NOT reference or collection, watchDepth defaults to deep watching by value