diff --git a/lib/ClassMetadata.php b/lib/ClassMetadata.php index f441df5..ef7e5fc 100644 --- a/lib/ClassMetadata.php +++ b/lib/ClassMetadata.php @@ -133,4 +133,11 @@ public function getName(): string { return $this->getReflectionClass()->name; } + + /** + * {@inheritdoc} + */ + public function finalize(): void + { + } } diff --git a/lib/ClassMetadataInterface.php b/lib/ClassMetadataInterface.php index d13dbb0..aee7f0f 100644 --- a/lib/ClassMetadataInterface.php +++ b/lib/ClassMetadataInterface.php @@ -31,4 +31,10 @@ public function getAttributesMetadata(): array; * @param MetadataInterface $metadata */ public function addAttributeMetadata(MetadataInterface $metadata): void; + + /** + * Called after all attributes metadata has been loaded and this metadata instance + * is merged with the parents. + */ + // public function finalize(): void; } diff --git a/lib/Factory/AbstractMetadataFactory.php b/lib/Factory/AbstractMetadataFactory.php index e01d308..f75cebc 100644 --- a/lib/Factory/AbstractMetadataFactory.php +++ b/lib/Factory/AbstractMetadataFactory.php @@ -74,6 +74,10 @@ public function getMetadataFor($value): ClassMetadataInterface } $this->mergeSuperclasses($classMetadata); + if (\method_exists($classMetadata, 'finalize')) { + $classMetadata->finalize(); + } + $this->validate($classMetadata); $this->dispatchClassMetadataLoadedEvent($classMetadata); diff --git a/tests/Factory/MetadataFactoryTest.php b/tests/Factory/MetadataFactoryTest.php index 112964e..2254dcb 100644 --- a/tests/Factory/MetadataFactoryTest.php +++ b/tests/Factory/MetadataFactoryTest.php @@ -41,6 +41,12 @@ protected function createMetadata(\ReflectionClass $class): ClassMetadataInterfa class FakeClassMetadata extends ClassMetadata { + public $finalized = false; + + public function finalize(): void + { + $this->finalized = true; + } } class FakeClassNoMetadata @@ -242,6 +248,20 @@ public function set_metadata_class_should_create_specified_object() self::assertInstanceOf(FakeClassMetadata::class, $factory->getMetadataFor($this)); } + /** + * @test + */ + public function get_metadata_for_should_call_metadata_finalizer_method() + { + $this->loader->loadClassMetadata(Argument::type(ClassMetadataInterface::class))->willReturn(true); + + $factory = new MetadataFactory($this->loader->reveal()); + $factory->setMetadataClass(FakeClassMetadata::class); + $metadata = $factory->getMetadataFor($this); + + self::assertTrue($metadata->finalized); + } + /** * @test */