docs: function (evt, callback) {
      var self = this;
  
      var payload = evt;
  
      if (self.payload && self.payload !== '') {
        payload = dotty.get(evt, self.payload);
      }
  
      if (self.evtExtFn.length === 3) {
        if (self.id) {
          self.extractId(evt, function (err, id) {
            if (err) {
              debug(err);
              return callback(err);
            }
  
            self.loadViewModel(id, function (err, vm) {
              if (err) {
                debug(err);
                return callback(err);
              }
  
              try {
                self.evtExtFn(_.cloneDeep(payload), vm, function () {
                  try {
                    callback.apply(this, _.toArray(arguments));
                  } catch (e) {
                    debug(e);
                    process.emit('uncaughtException', e);
                  }
                });
              } catch (e) {
                debug(e);
                process.emit('uncaughtException', e);
              }
            });
          });
          return;
        }
  
        try {
          self.evtExtFn(_.cloneDeep(payload), self.collection, function () {
            try {
              callback.apply(this, _.toArray(arguments));
            } catch (e) {
              debug(e);
              process.emit('uncaughtException', e);
            }
          });
        } catch (e) {
          debug(e);
          process.emit('uncaughtException', e);
        }
        return;
      }
  
      if (self.evtExtFn.length === 1) {
        try {
          var res = self.evtExtFn(evt);
          try {
            callback(null, res);
          } catch (e) {
            debug(e);
            process.emit('uncaughtException', e);
          }
        } catch (e) {
          debug(e);
          process.emit('uncaughtException', e);
        }
        return;
      }
  
      if (self.evtExtFn.length === 2) {
        if (!self.collection || !self.id) {
          try {
            self.evtExtFn(evt, function () {
              try {
                callback.apply(this, _.toArray(arguments));
              } catch (e) {
                debug(e);
                process.emit('uncaughtException', e);
              }
            });
          } catch (e) {
            debug(e);
            process.emit('uncaughtException', e);
          }
          return;
        }
  
        self.extractId(evt, function (err, id) {
          if (err) {
            debug(err);
            return callback(err);
          }
  
          self.loadViewModel(id, function (err, vm) {
            if (err) {
              debug(err);
              return callback(err);
            }
  
            try {
              var res = self.evtExtFn(_.cloneDeep(payload), vm);
              try {
                callback(null, res);
              } catch (e) {
                debug(e);
                process.emit('uncaughtException', e);
              }
            } catch (e) {
              debug(e);
              process.emit('uncaughtException', e);
            }
          });
        });
      }
    }