validateRegistration($type, $config); $this->configs[$type] = $config; } public function has(string $type): bool { return isset($this->configs[$type]); } public function getExecutor(string $type): ?Executor { return $this->configs[$type]?->executor; } public function getMergeable(string $type): ?Mergeable { $config = $this->configs[$type] ?? null; if (!$config) { return null; } // Explicit mergeable always wins if ($config->mergeable) { return $config->mergeable; } // Default merge based on chunkKey if ($config->chunkKey) { return new DefaultMerger($config->chunkKey); } return null; } public function getConfig(string $type): ?TypeConfig { return $this->configs[$type] ?? null; } public function getChunkConfig(string $type): ?array { $config = $this->configs[$type] ?? null; if (!$config || empty($config->chunkKey)) { return null; } return [ 'key' => $config->chunkKey, 'size' => $config->chunkSize, ]; } public function getMaxRetries(string $type): int { return $this->configs[$type]?->maxRetries ?? 3; } public function validateRegistration(string $type, TypeConfig $config): void { if ($config->executor && $config->chunkKey) { // Verify executor can handle chunked operations if (!method_exists($config->executor, 'execute')) { throw new \InvalidArgumentException( "Executor for '{$type}' must implement execute() method" ); } } } }