docs: function patchCallbacks(target, targetName, method, callbacks) {
      var symbol = Zone.__symbol__(method);
      if (target[symbol]) {
          return;
      }
      var nativeDelegate = target[symbol] = target[method];
      target[method] = function (name, opts, options) {
          if (opts && opts.prototype) {
              callbacks.forEach(function (callback) {
                  var source = targetName + "." + method + "::" + callback;
                  var prototype = opts.prototype;
                  if (prototype.hasOwnProperty(callback)) {
                      var descriptor = ObjectGetOwnPropertyDescriptor(prototype, callback);
                      if (descriptor && descriptor.value) {
                          descriptor.value = wrapWithCurrentZone(descriptor.value, source);
                          _redefineProperty(opts.prototype, callback, descriptor);
                      }
                      else if (prototype[callback]) {
                          prototype[callback] = wrapWithCurrentZone(prototype[callback], source);
                      }
                  }
                  else if (prototype[callback]) {
                      prototype[callback] = wrapWithCurrentZone(prototype[callback], source);
                  }
              });
          }
          return nativeDelegate.call(target, name, opts, options);
      };
      attachOriginToPatched(target[method], nativeDelegate);
  }