/** * Create and return a new object * * @param RepositoryInterface $repository Repository to create the object in * @param Type $type Object type * @param string $payload Object payload * @param array $propertyData Object property data * @param \DateTimeInterface $creationDate Object creation date * @return ObjectInterface Object */ public function createObject(RepositoryInterface $repository, Type $type, $payload = '', array $propertyData = [], \DateTimeInterface $creationDate = null) { // Set the creation date to now if empty if ($creationDate === null) { $creationDate = new \DateTimeImmutable('now'); } // Construct a creation closure $creationClosure = function (Id $uid) use($repository, $type, $payload, $propertyData, $creationDate) { /** @var Revision $revision */ $revision = Kernel::create(Revision::class, [1, true]); /** @var RepositoryLocator $repositoryLocator */ $repositoryLocator = Kernel::create(RepositoryLocator::class, [$repository]); $repositoryLocator = $repositoryLocator->setId($uid); $repositoryLocator = $repositoryLocator->setRevision($revision); $repositoryLocator = $repositoryLocator->setObjectType($type); $repositoryLocator = $repositoryLocator->setCreationDate($creationDate); return ObjectFactory::createFromParams($repositoryLocator, $payload, $propertyData); }; // Wrap the object creation in an ID allocation transaction return $repository->getAdapterStrategy()->createObjectResource($creationClosure); }