, array[]> */ private array $plugins = []; /** * Constructor. * * @param class-string $plugin Plugin * @param array $config Config */ public function __construct(string $plugin, array $config) { $this->plugins[$plugin] = [$config]; } /** * Merge with other plugins. * * @param self $other Plugins * * @return void */ public function merge(self $other): void { foreach ($other->plugins as $plugin => $configs) { if (isset($this->plugins[$plugin])) { $this->plugins[$plugin] = \array_merge($this->plugins[$plugin], $configs); } else { $this->plugins[$plugin] = $configs; } } } /** * Enqueue plugins. * * @param SplQueue $queue * * @return void */ public function enqueue(SplQueue $queue): void { foreach ($this->plugins as $plugin => $configs) { foreach ($plugin::mergeConfigs(...$configs) as $config) { $pluginObj = new $plugin; $pluginObj->setConfigArray($config); $queue->enqueue($pluginObj); } } } }