/**
  * Apply the provided event. Applying events means they are added to the uncommitted event queue
  * and forwarded to the {@link #handle(org.axonframework.domain.DomainEventMessage)} event handler
  * method} for processing.
  *
  * <p>The event is applied on all entities part of this aggregate.
  *
  * @param eventPayload The payload of the event to apply
  * @param metaData any meta-data that must be registered with the Event
  */
 protected void apply(Object eventPayload, MetaData metaData) {
   if (getIdentifier() == null) {
     // workaround for aggregates that set the aggregate identifier in an Event Handler
     if (getUncommittedEventCount() > 0 || getVersion() != null) {
       throw new IncompatibleAggregateException(
           "The Aggregate Identifier has not been initialized. "
               + "It must be initialized at the latest when the "
               + "first event is applied.");
     }
     handleRecursively(new GenericDomainEventMessage<Object>(null, 0, eventPayload, metaData));
     registerEvent(metaData, eventPayload);
   } else {
     DomainEventMessage event = registerEvent(metaData, eventPayload);
     handleRecursively(event);
   }
 }
 /**
  * {@inheritDoc}
  *
  * <p>This implementation is aware of a special type of <code>DomainEvents</code>: the <code>
  * AggregateSnapshot</code>, which is a snapshot event, containing the actual aggregate inside.
  *
  * <p><code>AggregateSnapshot</code> events are used to initialize the aggregate with the correct
  * version ({@link #getVersion()}).
  *
  * @throws IllegalStateException if this aggregate was already initialized.
  */
 @Override
 public void initializeState(DomainEventStream domainEventStream) {
   Assert.state(getUncommittedEventCount() == 0, "Aggregate is already initialized");
   long lastSequenceNumber = -1;
   while (domainEventStream.hasNext()) {
     DomainEventMessage event = domainEventStream.next();
     lastSequenceNumber = event.getSequenceNumber();
     handleRecursively(event);
   }
   initializeEventStream(lastSequenceNumber);
 }