docs: function Denormalizer(options) {
    EventEmitter.call(this);
  
    options = options || {};
  
    if (!options.denormalizerPath) {
      var err = new Error('Please provide denormalizerPath in options');
      debug(err);
      throw err;
    }
  
    var defaults = {
      retryOnConcurrencyTimeout: 800,
      commandRejectedEventName: 'commandRejected',
      callOnAfterCommitDuringReplay: false
    };
  
    _.defaults(options, defaults);
  
    this.structureLoader = createStructureLoader(options.structureLoader);
  
    this.repository = viewmodel.write(options.repository);
  
    var defaultRevOpt = {
      queueTimeout: 1000,
      queueTimeoutMaxLoops: 3//,
      // startRevisionNumber: 1
    };
  
    options.revisionGuard = options.revisionGuard || {};
  
    _.defaults(options.revisionGuard, defaultRevOpt);
  
    this.revisionGuardStore = revisionGuardStore.create(options.revisionGuard);
  
    this.options = options;
  
    this.definitions = {
      event: {
        correlationId: 'correlationId', // optional
        id: 'id',                       // optional
        name: 'name',                   // optional
  //      aggregateId: 'aggregate.id',    // optional
  //      context: 'context.name',        // optional
  //      aggregate: 'aggregate.name',    // optional
        payload: 'payload'              // optional
  //      revision: 'revision'            // optional
  //      version: 'version',             // optional
  //      meta: 'meta'                    // optional, if defined theses values will be copied to the notification (can be used to transport information like userId, etc..)
      },
      notification: {
        correlationId: 'correlationId',      // optional, the command Id
        id: 'id',                            // optional
        action: 'name',                      // optional
        collection: 'collection',            // optional
        payload: 'payload'                   // optional
  //      context: 'meta.context.name',        // optional, if defined theses values will be copied from the event
  //      aggregate: 'meta.aggregate.name',    // optional, if defined theses values will be copied from the event
  //      aggregateId: 'meta.aggregate.id',    // optional, if defined theses values will be copied from the event
  //      revision: 'meta.aggregate.revision', // optional, if defined theses values will be copied from the event
  //      eventId: 'meta.event.id',            // optional, if defined theses values will be copied from the event
  //      event: 'meta.event.name',            // optional, if defined theses values will be copied from the event
  //      meta: 'meta'                         // optional, if defined theses values will be copied from the event (can be used to transport information like userId, etc..)
      }
    };
  
    this.idGenerator(function () {
      return uuid().toString();
    });
  
    this.onEvent(function (evt) {
      debug('emit event:', evt);
    });
  
    this.onNotification(function (noti) {
      debug('emit notification:', noti);
    });
  
    this.onEventMissing(function (info, evt) {
      debug('missing events: ', info, evt);
    });
  
    this.defaultEventExtension(function (evt) {
      return evt;
    });
  }