*/ private array $criteria = []; /** @var list */ private array $views = []; public function register(SelectionCriteriaInterface $criteria, ViewTemplate $view): void { $this->criteria[] = $criteria; $this->views[] = $view; } public function find(Instrument $instrument, InstrumentationScopeInterface $instrumentationScope): ?iterable { $views = $this->generateViews($instrument, $instrumentationScope); return $views->valid() ? $views : null; } private function generateViews(Instrument $instrument, InstrumentationScopeInterface $instrumentationScope): Generator { foreach ($this->criteria as $i => $criteria) { if ($criteria->accepts($instrument, $instrumentationScope)) { yield $this->views[$i]->project($instrument); } } } }