. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Factories; use Fisharebest\Webtrees\Contracts\SurnameTraditionFactoryInterface; use Fisharebest\Webtrees\SurnameTradition\DefaultSurnameTradition; use Fisharebest\Webtrees\SurnameTradition\IcelandicSurnameTradition; use Fisharebest\Webtrees\SurnameTradition\LithuanianSurnameTradition; use Fisharebest\Webtrees\SurnameTradition\MatrilinealSurnameTradition; use Fisharebest\Webtrees\SurnameTradition\PaternalSurnameTradition; use Fisharebest\Webtrees\SurnameTradition\PatrilinealSurnameTradition; use Fisharebest\Webtrees\SurnameTradition\PolishSurnameTradition; use Fisharebest\Webtrees\SurnameTradition\PortugueseSurnameTradition; use Fisharebest\Webtrees\SurnameTradition\SpanishSurnameTradition; use Fisharebest\Webtrees\SurnameTradition\SurnameTraditionInterface; /** * Create a surname tradition. */ class SurnameTraditionFactory implements SurnameTraditionFactoryInterface { /** @var array */ private array $surname_traditions = []; /** * Register the surname traditions. */ public function __construct() { $this->register(self::PATERNAL, new PaternalSurnameTradition()); $this->register(self::PATRILINEAL, new PatrilinealSurnameTradition()); $this->register(self::MATRILINEAL, new MatrilinealSurnameTradition()); $this->register(self::PORTUGUESE, new PortugueseSurnameTradition()); $this->register(self::SPANISH, new SpanishSurnameTradition()); $this->register(self::POLISH, new PolishSurnameTradition()); $this->register(self::LITHUANIAN, new LithuanianSurnameTradition()); $this->register(self::ICELANDIC, new IcelandicSurnameTradition()); $this->register(self::DEFAULT, new DefaultSurnameTradition()); } /** * A list of supported surname traditions and their names. * * @return array */ public function list(): array { $fn = static fn (SurnameTraditionInterface $surname_tradition): string => $surname_tradition->name() . ' — ' . $surname_tradition->description(); return array_map($fn, $this->surname_traditions); } /** * Create a named surname tradition. * * @param string $name * * @return SurnameTraditionInterface */ public function make(string $name): SurnameTraditionInterface { return $this->surname_traditions[$name] ?? new DefaultSurnameTradition(); } /** * @param string $name * @param SurnameTraditionInterface $surname_tradition * * @return void */ public function register(string $name, SurnameTraditionInterface $surname_tradition): void { $this->surname_traditions[$name] = $surname_tradition; } }