*/ private AttributeExtractorFactory $attributeExtractorFactory; private EventDispatcher $eventDispatcher; /** * @param AttributeExtractorFactory $attributeExtractorFactory */ public function __construct( ValueFactoryFactory $valueFactoryFactory, AttributeExtractorFactory $attributeExtractorFactory, EventDispatcher $eventDispatcher ) { $this->valueFactoryFactory = $valueFactoryFactory; $this->attributeExtractorFactory = $attributeExtractorFactory; $this->eventDispatcher = $eventDispatcher; $this->subscribeToMetadataUpdate(); } public function create(Entity $entity): ValueAccessor { return new ValueAccessor( $entity, $this->getGeneralValueFactory(), $this->getGeneralAttributeExtractor() ); } 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; } ); } }