code: function getRenderer(attrs, scope) {
      var statics = {
        enter: function (element, target, cb) { target.after(element); cb(); },
        leave: function (element, cb) { element.remove(); cb(); }
      };
  
      if (!!attrs.noanimation) return statics;
  
      function animEnabled(element) {
        if (ngMajorVer === 1 && ngMinorVer >= 4) return !!$animate.enabled(element);
        if (ngMajorVer === 1 && ngMinorVer >= 2) return !!$animate.enabled();
        return (!!$animator);
      }
  
      // ng 1.2+
      if ($animate) {
        return {
          enter: function(element, target, cb) {
            if (!animEnabled(element)) {
              statics.enter(element, target, cb);
            } else if (angular.version.minor > 2) {
              $animate.enter(element, null, target).then(cb);
            } else {
              $animate.enter(element, null, target, cb);
            }
          },
          leave: function(element, cb) {
            if (!animEnabled(element)) {
              statics.leave(element, cb);
            } else if (angular.version.minor > 2) {
              $animate.leave(element).then(cb);
            } else {
              $animate.leave(element, cb);
            }
          }
        };
      }
  
      // ng 1.1.5
      if ($animator) {
        var animate = $animator && $animator(scope, attrs);
  
        return {
          enter: function(element, target, cb) {animate.enter(element, null, target); cb(); },
          leave: function(element, cb) { animate.leave(element); cb(); }
        };
      }
  
      return statics;
    }
docs: Returns a set of DOM manipulation functions based on which Angular version it should use