$arguments * * @return object */ public static function __callStatic($name, $arguments){ if(count($arguments) > 0){ throw new \ArgumentCountError("Expected exactly 0 arguments, " . count($arguments) . " passed"); } try{ return self::fromString($name); }catch(\InvalidArgumentException $e){ throw new \Error($e->getMessage(), 0, $e); } } /** * @return object[] */ private static function _registryGetAll() : array{ self::checkInit(); return self::$members; } /** * Generates code for static methods for all known registry members. */ public static function _generateGetters() : string{ $lines = []; static $fnTmpl = ' public static function %1$s() : %2$s{ return self::fromString("%1$s"); }'; foreach(self::getAll() as $name => $member){ $lines[] = sprintf($fnTmpl, $name, '\\' . get_class($member)); } return "//region auto-generated code\n" . implode("\n", $lines) . "\n\n//endregion\n"; } /** * Generates a block of @ method annotations for accessors for this registry's known members. */ public static function _generateMethodAnnotations() : string{ $traitName = (new \ReflectionClass(__TRAIT__))->getShortName(); $fnName = (new \ReflectionMethod(__METHOD__))->getShortName(); $lines = ["/**"]; $lines[] = " * This doc-block is generated automatically, do not modify it manually."; $lines[] = " * This must be regenerated whenever registry members are added, removed or changed."; $lines[] = " * @see $traitName::$fnName()"; $lines[] = " *"; static $lineTmpl = " * @method static %2\$s %s()"; $thisNamespace = (new \ReflectionClass(__CLASS__))->getNamespaceName(); foreach(self::getAll() as $name => $member){ $reflect = new \ReflectionClass($member); while($reflect !== false and $reflect->isAnonymous()){ $reflect = $reflect->getParentClass(); } if($reflect === false){ $typehint = "object"; }elseif($reflect->getName() === __CLASS__){ $typehint = "self"; }elseif(strpos($reflect->getName(), $thisNamespace) === 0){ $typehint = substr($reflect->getName(), strlen($thisNamespace . '\\')); }else{ $typehint = '\\' . $reflect->getName(); } $lines[] = sprintf($lineTmpl, $name, $typehint); } $lines[] = " */\n"; return implode("\n", $lines); } }