whole_func_string: function() {
    var postDigestQueue = new NgMap();
    var postDigestElements = [];
  
    this.$get = ['$$AnimateRunner', '$rootScope',
         function($$AnimateRunner,   $rootScope) {
      return {
        enabled: noop,
        on: noop,
        off: noop,
        pin: noop,
  
        push: function(element, event, options, domOperation) {
          if (domOperation) {
            domOperation();
          }
  
          options = options || {};
          if (options.from) {
            element.css(options.from);
          }
          if (options.to) {
            element.css(options.to);
          }
  
          if (options.addClass || options.removeClass) {
            addRemoveClassesPostDigest(element, options.addClass, options.removeClass);
          }
  
          var runner = new $$AnimateRunner();
  
          // since there are no animations to run the runner needs to be
          // notified that the animation call is complete.
          runner.complete();
          return runner;
        }
      };
  
  
      function updateData(data, classes, value) {
        var changed = false;
        if (classes) {
          classes = isString(classes) ? classes.split(' ') :
                    isArray(classes) ? classes : [];
          forEach(classes, function(className) {
            if (className) {
              changed = true;
              data[className] = value;
            }
          });
        }
        return changed;
      }
  
      function handleCSSClassChanges() {
        forEach(postDigestElements, function(element) {
          var data = postDigestQueue.get(element);
          if (data) {
            var existing = splitClasses(element.attr('class'));
            var toAdd = '';
            var toRemove = '';
            forEach(data, function(status, className) {
              var hasClass = !!existing[className];
              if (status !== hasClass) {
                if (status) {
                  toAdd += (toAdd.length ? ' ' : '') + className;
                } else {
                  toRemove += (toRemove.length ? ' ' : '') + className;
                }
              }
            });
  
            forEach(element, function(elm) {
              if (toAdd) {
                jqLiteAddClass(elm, toAdd);
              }
              if (toRemove) {
                jqLiteRemoveClass(elm, toRemove);
              }
            });
            postDigestQueue.delete(element);
          }
        });
        postDigestElements.length = 0;
      }
  
  
      function addRemoveClassesPostDigest(element, add, remove) {
        var data = postDigestQueue.get(element) || {};
  
        var classesAdded = updateData(data, add, true);
        var classesRemoved = updateData(data, remove, false);
  
        if (classesAdded || classesRemoved) {
  
          postDigestQueue.set(element, data);
          postDigestElements.push(element);
  
          if (postDigestElements.length === 1) {
            $rootScope.$$postDigest(handleCSSClassChanges);
          }
        }
      }
    }];
  }
func_code_string: function() {
    var postDigestQueue = new NgMap();
    var postDigestElements = [];
  
    this.$get = ['$$AnimateRunner', '$rootScope',
         function($$AnimateRunner,   $rootScope) {
      return {
        enabled: noop,
        on: noop,
        off: noop,
        pin: noop,
  
        push: function(element, event, options, domOperation) {
          if (domOperation) {
            domOperation();
          }
  
          options = options || {};
          if (options.from) {
            element.css(options.from);
          }
          if (options.to) {
            element.css(options.to);
          }
  
          if (options.addClass || options.removeClass) {
            addRemoveClassesPostDigest(element, options.addClass, options.removeClass);
          }
  
          var runner = new $$AnimateRunner();
  
          // since there are no animations to run the runner needs to be
          // notified that the animation call is complete.
          runner.complete();
          return runner;
        }
      };
  
  
      function updateData(data, classes, value) {
        var changed = false;
        if (classes) {
          classes = isString(classes) ? classes.split(' ') :
                    isArray(classes) ? classes : [];
          forEach(classes, function(className) {
            if (className) {
              changed = true;
              data[className] = value;
            }
          });
        }
        return changed;
      }
  
      function handleCSSClassChanges() {
        forEach(postDigestElements, function(element) {
          var data = postDigestQueue.get(element);
          if (data) {
            var existing = splitClasses(element.attr('class'));
            var toAdd = '';
            var toRemove = '';
            forEach(data, function(status, className) {
              var hasClass = !!existing[className];
              if (status !== hasClass) {
                if (status) {
                  toAdd += (toAdd.length ? ' ' : '') + className;
                } else {
                  toRemove += (toRemove.length ? ' ' : '') + className;
                }
              }
            });
  
            forEach(element, function(elm) {
              if (toAdd) {
                jqLiteAddClass(elm, toAdd);
              }
              if (toRemove) {
                jqLiteRemoveClass(elm, toRemove);
              }
            });
            postDigestQueue.delete(element);
          }
        });
        postDigestElements.length = 0;
      }
  
  
      function addRemoveClassesPostDigest(element, add, remove) {
        var data = postDigestQueue.get(element) || {};
  
        var classesAdded = updateData(data, add, true);
        var classesRemoved = updateData(data, remove, false);
  
        if (classesAdded || classesRemoved) {
  
          postDigestQueue.set(element, data);
          postDigestElements.push(element);
  
          if (postDigestElements.length === 1) {
            $rootScope.$$postDigest(handleCSSClassChanges);
          }
        }
      }
    }];
  }
func_documentation_string: this is prefixed with Core since it conflicts with the animateQueueProvider defined in ngAnimate/animateQueue.js