, RecordMapper> */ protected array $byRecord = []; /** @var array, RecordMapper> */ protected array $byModel = []; /** @var array Keyed by NSID */ protected array $byLexicon = []; /** * Register a mapper. */ public function register(RecordMapper $mapper): void { $recordClass = $mapper->recordClass(); $modelClass = $mapper->modelClass(); $this->byRecord[$recordClass] = $mapper; $this->byModel[$modelClass] = $mapper; $this->byLexicon[$mapper->lexicon()] = $mapper; } /** * Get a mapper by Record class. * * @param class-string $recordClass */ public function forRecord(string $recordClass): ?RecordMapper { return $this->byRecord[$recordClass] ?? null; } /** * Get a mapper by Model class. * * @param class-string $modelClass */ public function forModel(string $modelClass): ?RecordMapper { return $this->byModel[$modelClass] ?? null; } /** * Get a mapper by lexicon NSID. */ public function forLexicon(string $nsid): ?RecordMapper { return $this->byLexicon[$nsid] ?? null; } /** * Check if a mapper exists for the given lexicon. */ public function hasLexicon(string $nsid): bool { return isset($this->byLexicon[$nsid]); } /** * Get all registered lexicon NSIDs. * * @return array */ public function lexicons(): array { return array_keys($this->byLexicon); } /** * Get all registered mappers. * * @return array */ public function all(): array { return array_values($this->byLexicon); } }