/**
  * @param UnitOfWork $unitOfWork
  * @param Contract   $aggregateRootType
  *
  * @return AggregateRootRepository
  */
 public function create(UnitOfWork $unitOfWork, Contract $aggregateRootType)
 {
     $repository = new AggregateRootRepository($unitOfWork, $aggregateRootType, $this->eventStore, $this->eventBus, $this->aggregateRootFactory);
     if (null === $this->saveAggregateCallbackFactory) {
         $saveCallbackFactory = new SimpleSaveAggregateCallbackFactory($repository);
         $repository->setSaveAggregateCallbackFactory($saveCallbackFactory);
     } else {
         $repository->setSaveAggregateCallbackFactory($this->saveAggregateCallbackFactory);
     }
     return $repository;
 }
 /**
  * @expectedException \RayRutjes\DomainFoundation\Repository\ConflictingAggregateVersionException
  */
 public function testShouldEnsureTheLoadedAggregateRootMatchesTheExpectedVersion()
 {
     $identifier = new AggregateRootIdentifierStub('identifier');
     $event = new GenericEvent($identifier, 1, MessageIdentifier::generate(), new Created($identifier));
     $this->eventStore->method('read')->willReturn(new GenericEventStream([$event]));
     $this->repository->load($identifier, 0);
 }
 /**
  * @param AggregateRoot $aggregate
  */
 public function save(AggregateRoot $aggregate)
 {
     $this->repository->doSave($aggregate);
     $aggregate->commitChanges();
 }
 /**
  * @param UserIdentifier $userIdentifier
  * @param null           $expectedVersion
  *
  * @return User
  */
 public function load(UserIdentifier $userIdentifier, $expectedVersion = null)
 {
     return $this->repository->load($userIdentifier, $expectedVersion);
 }