diff --git a/src/DeepCopy/DeepCopy.php b/src/DeepCopy/DeepCopy.php index f739d92..cc82df6 100644 --- a/src/DeepCopy/DeepCopy.php +++ b/src/DeepCopy/DeepCopy.php @@ -122,6 +122,14 @@ public function addTypeFilter(TypeFilter $filter, TypeMatcher $matcher) ]; } + public function prependTypeFilter(TypeFilter $filter, TypeMatcher $matcher) + { + array_unshift($this->typeFilters, [ + 'matcher' => $matcher, + 'filter' => $filter, + ]); + } + private function recursiveCopy($var) { // Matches Type Filter diff --git a/tests/DeepCopyTest/DeepCopyTest.php b/tests/DeepCopyTest/DeepCopyTest.php index 2b31536..ae35cbc 100644 --- a/tests/DeepCopyTest/DeepCopyTest.php +++ b/tests/DeepCopyTest/DeepCopyTest.php @@ -30,6 +30,7 @@ use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher; use DeepCopy\Matcher\PropertyNameMatcher; use DeepCopy\Matcher\PropertyTypeMatcher; +use DeepCopy\TypeFilter\ReplaceFilter; use DeepCopy\TypeFilter\ShallowCopyFilter; use DeepCopy\TypeMatcher\TypeMatcher; use PHPUnit\Framework\TestCase; @@ -475,6 +476,21 @@ public function test_it_can_prepend_filter() $this->assertNull($copy->getFoo()); } + public function test_it_can_prepend_type_filter() + { + $object = new f008\A('bar'); + $deepCopy = new DeepCopy(); + $deepCopy->addTypeFilter(new ReplaceFilter(function ($object) { + return new f008\A('baz'); + }), new TypeMatcher(f008\A::class)); + $deepCopy->prependTypeFilter(new ReplaceFilter(function ($object) { + return new f008\A('foo'); + }), new TypeMatcher(f008\A::class)); + + $copy = $deepCopy->copy($object); + $this->assertEquals('foo',$copy->getFoo()); + } + /** * @ticket https://github.com/myclabs/DeepCopy/issues/143 * @requires PHP 7.4