valueFactoryFactory = $valueFactoryFactory; $this->attributeExtractorFactory = $attributeExtractorFactory; $this->eventDispatcher = $eventDispatcher; $this->subscribeToMetadataUpdate(); } public function create(Entity $entity): ValueAccessor { $generalValueFactory = $this->getGeneralValueFactory(); $generalAttributeExtractor = $this->getGeneralAttributeExtractor(); return new ValueAccessor($entity, $generalValueFactory, $generalAttributeExtractor); } private function getGeneralValueFactory(): GeneralValueFactory { if (!$this->generalValueFactory) { $this->generalValueFactory = new GeneralValueFactory( $this->valueFactoryFactory ); } return $this->generalValueFactory; } private function getGeneralAttributeExtractor(): GeneralAttributeExtractor { if (!$this->generalAttributeExtractor) { $this->generalAttributeExtractor = new GeneralAttributeExtractor( $this->attributeExtractorFactory ); } return $this->generalAttributeExtractor; } private function subscribeToMetadataUpdate(): void { $this->eventDispatcher->subscribeToMetadataUpdate( function () { $this->generalValueFactory = null; $this->generalAttributeExtractor = null; } ); } }