*/ private array $integrations = []; public function register(IntegrationInterface $integration): void { $this->integrations[$integration->get_id()] = $integration; } public function boot(): void { $activeSelection = sanitize_key((string) Settings::get('selection_mode', 'builtin')); $selectionReady = isset($this->integrations[$activeSelection]) && 'selection' === $this->integrations[$activeSelection]->get_type() && $this->integrations[$activeSelection]->is_available(); foreach ($this->integrations as $integration) { if (!$integration->is_available()) { continue; } if ('selection' === $integration->get_type() && !$selectionReady) { if ('builtin' === $integration->get_id()) { $integration->register(); } continue; } if (!$this->is_enabled($integration)) { continue; } $integration->register(); } } public function is_enabled(IntegrationInterface $integration): bool { return match ($integration->get_type()) { 'selection' => $integration->get_id() === sanitize_key((string) Settings::get('selection_mode', 'builtin')), 'material_source' => $integration->get_id() === sanitize_key((string) Settings::get('material_source', '')), default => true, }; } /** @return array */ public function all(): array { return $this->integrations; } /** @return array */ public function by_type(string $type): array { return array_filter($this->integrations, static fn (IntegrationInterface $integration): bool => $integration->get_type() === $type); } public function ids_by_type(string $type, bool $availableOnly = true): array { $ids = []; foreach ($this->by_type($type) as $integration) { if (!$availableOnly || $integration->is_available()) { $ids[] = $integration->get_id(); } } return $ids; } }