indexer map, just * a plain list since a provider isn't keyed to one model. Core never references a * specific provider class; a future ERP/banking/etc. module just adds its own * provider class to that config array and PrivacyService picks it up automatically. */ class PrivacyManager { public function __construct(private readonly Container $container) {} /** * @return array */ public function providers(): array { $providers = array_map( fn (string $class) => $this->container->make($class), config('core.privacy.providers', []) ); $this->assertUniqueNames($providers); return $providers; } /** * @param array $providers */ private function assertUniqueNames(array $providers): void { $names = array_map(fn (PersonalDataProvider $provider) => $provider->name(), $providers); $duplicates = array_diff_assoc($names, array_unique($names)); if ($duplicates !== []) { throw new LogicException( 'Duplicate Modules\Core\Privacy provider name(s): '.implode(', ', array_unique($duplicates)) .'. Each provider registered in config(\'core.privacy.providers\') must return a unique name().' ); } } }