*/ final class DisjunctExclusionStrategy implements ExclusionStrategyInterface { /** * @var ExclusionStrategyInterface[] */ private $delegates = []; /** * @param ExclusionStrategyInterface[] $delegates */ public function __construct(array $delegates = []) { $this->delegates = $delegates; } public function addStrategy(ExclusionStrategyInterface $strategy): void { $this->delegates[] = $strategy; } /** * Whether the class should be skipped. */ public function shouldSkipClass(ClassMetadata $metadata, Context $context): bool { foreach ($this->delegates as $delegate) { /** @var $delegate ExclusionStrategyInterface */ if ($delegate->shouldSkipClass($metadata, $context)) { return true; } } return false; } /** * Whether the property should be skipped. */ public function shouldSkipProperty(PropertyMetadata $property, Context $context): bool { foreach ($this->delegates as $delegate) { /** @var $delegate ExclusionStrategyInterface */ if ($delegate->shouldSkipProperty($property, $context)) { return true; } } return false; } }