*/ private iterable $converters, /** * @var iterable */ private iterable $displayers, ) {} public function getSubjectsForEntity(mixed $subject, bool $includeAssociated = false): SubjectBag { foreach ($this->converters as $converter) { if ($converter instanceof SubjectConverterManagerAwareInterface) { $converter->setSubjectConverterManager($this); } if ($converter->supportsConvert($subject)) { return $converter->convert($subject, $includeAssociated); } } throw new ConvertSubjectException($subject); } public function display(Subject $subject, string $format = 'html', array $options = []): string { foreach ($this->displayers as $displayer) { if ($displayer->supportsDisplay($subject)) { return $displayer->display($subject, $format, $options); } } throw new DisplaySubjectException($subject->asArray()); } }