|null */ private ?array $plugins = null; /** * @param iterable $bundles */ public function __construct( #[TaggedIterator(PluginInterface::class)] private readonly iterable $bundles ) { } /** * @return Plugin[] */ public function getPlugins(): array { if ($this->plugins === null) { $plugins = []; foreach ($this->bundles as $bundle) { $plugins[$bundle->getName()] = new Plugin($bundle); } $this->plugins = array_values($plugins); } return $this->plugins; } public function hasPlugin(string $name): bool { foreach ($this->bundles as $plugin) { if ($plugin->getName() === $name) { return true; } } return false; } public function getPlugin(string $name): ?Plugin { $plugins = $this->getPlugins(); foreach ($plugins as $plugin) { if ($plugin->getId() === $name) { return $plugin; } } return null; } }