22declare(strict_types=1);
26use
function array_map;
28use
function mb_strtoupper;
29use
function preg_match;
45 private static $members =
null;
47 private static function verifyName(
string $name) :
void{
48 if(preg_match(
'/^(?!\d)[A-Za-z\d_]+$/u', $name) === 0){
49 throw new \InvalidArgumentException(
"Invalid member name \"$name\", should only contain letters, numbers and underscores, and must not start with a number");
58 private static function _registryRegister(
string $name,
object $member) :
void{
59 if(self::$members ===
null){
62 self::verifyName($name);
63 $upperName = mb_strtoupper($name);
64 if(isset(self::$members[$upperName])){
65 throw new \InvalidArgumentException(
"\"$upperName\" is already reserved");
67 self::$members[$upperName] = $member;
75 abstract protected static function setup() : void;
82 protected static function checkInit() : void{
83 if(self::$members === null){
92 private static function _registryFromString(
string $name) : object{
94 if(self::$members ===
null){
95 throw new AssumptionFailedError(self::class .
"::checkInit() did not initialize self::\$members correctly");
97 $upperName = mb_strtoupper($name);
98 if(!isset(self::$members[$upperName])){
99 throw new \InvalidArgumentException(
"No such registry member: " . self::class .
"::" . $upperName);
101 return self::preprocessMember(self::$members[$upperName]);
104 protected static function preprocessMember(
object $member) : object{
112 public static function __callStatic(
string $name, array $arguments) : object{
113 if(count($arguments) > 0){
114 throw new \ArgumentCountError(
"Expected exactly 0 arguments, " . count($arguments) .
" passed");
118 if(self::$members !==
null && isset(self::$members[$name])){
119 return self::preprocessMember(self::$members[$name]);
124 return self::_registryFromString($name);
125 }
catch(\InvalidArgumentException $e){
126 throw new \Error($e->getMessage(), 0, $e);
134 private static function _registryGetAll() : array{
136 return array_map(self::preprocessMember(...), self::$members ??
throw new AssumptionFailedError(self::class .
"::checkInit() did not initialize self::\$members correctly"));
static __callStatic(string $name, array $arguments)