docs: function (evt, callback) {
      if (!evt || !_.isObject(evt)) {
        var err = new Error('Please pass a valid event!');
        debug(err);
        throw err;
      }
  
      if (!callback || !_.isFunction(callback)) {
        var err = new Error('Please pass a valid callback!');
        debug(err);
        throw err;
      }
  
      var target = this.getTargetInformation(evt);
  
      var viewBuilders = this.tree.getViewBuilders(target);
  
      var errs = [];
      var notifications = [];
  
      var foundPrioSet = _.find(viewBuilders, function (vb) {
        return vb.priority < Infinity;
      });
  
      var eachMethod = 'each';
      if (foundPrioSet) {
        eachMethod = 'eachSeries';
      }
  
      async[eachMethod].call(async, viewBuilders, function (viewBuilder, callback) {
        viewBuilder.denormalize(evt, function (err, notis) {
          if (err) {
            debug(err);
            if (!errs.push) {
              var warn = new Error('ATTENTION! Already called back!');
              debug(warn);
              console.log(warn.stack);
              return;
            }
            errs.push(err);
          }
  
          if (notis && notis.length > 0) {
            notifications = notifications.concat(notis);
          }
          callback(null);
        });
      }, function () {
        if (errs.length === 0) {
          errs = null;
        }
        callback(errs, _.filter(notifications, function (n) { return !!n; }));
      });
    }