52 private static array $members;
54 private static bool $initialized =
false;
56 private function __construct(){
66 private static function unsafeAssign(\Closure $closure,
ArmorMaterial $memberValue) :
void{
72 $closure($memberValue);
79 private static function getInitAssigners() : array{
81 "chainmail" => fn(
ArmorMaterial $v) => self::$_mCHAINMAIL = $v,
87 "netherite" => fn(
ArmorMaterial $v) => self::$_mNETHERITE = $v,
92 private static function init() :
void{
95 if(self::$initialized){
96 throw new \LogicException(
"Circular dependency detected - use RegistrySource->registerDelayed() if the circular dependency can't be avoided");
98 self::$initialized =
true;
99 $assigners = self::getInitAssigners();
102 foreach($source->getAllValues() as $name => $value){
103 $assigner = $assigners[$name] ??
throw new \LogicException(
"Unexpected source registry member \"$name\" (code probably needs regenerating)");
104 if(isset($assigned[$name])){
106 throw new \LogicException(
"Repeated registry source member \"$name\"");
108 self::$members[mb_strtoupper($name)] = $value;
109 $assigned[$name] =
true;
110 unset($assigners[$name]);
111 self::unsafeAssign($assigner, $value);
113 if(count($assigners) > 0){
114 throw new \LogicException(
"Missing values for registry members (code probably needs regenerating): " . implode(
", ", array_keys($assigners)));
123 if(!isset(self::$members)){ self::init(); }
124 return self::$members;
127 public static function CHAINMAIL() : ArmorMaterial{
128 if(!isset(self::$_mCHAINMAIL)){ self::init(); }
129 return self::$_mCHAINMAIL;
132 public static function COPPER() : ArmorMaterial{
133 if(!isset(self::$_mCOPPER)){ self::init(); }
134 return self::$_mCOPPER;
137 public static function DIAMOND() : ArmorMaterial{
138 if(!isset(self::$_mDIAMOND)){ self::init(); }
139 return self::$_mDIAMOND;
142 public static function GOLD() : ArmorMaterial{
143 if(!isset(self::$_mGOLD)){ self::init(); }
144 return self::$_mGOLD;
147 public static function IRON() : ArmorMaterial{
148 if(!isset(self::$_mIRON)){ self::init(); }
149 return self::$_mIRON;
152 public static function LEATHER() : ArmorMaterial{
153 if(!isset(self::$_mLEATHER)){ self::init(); }
154 return self::$_mLEATHER;
157 public static function NETHERITE() : ArmorMaterial{
158 if(!isset(self::$_mNETHERITE)){ self::init(); }
159 return self::$_mNETHERITE;
162 public static function TURTLE() : ArmorMaterial{
163 if(!isset(self::$_mTURTLE)){ self::init(); }
164 return self::$_mTURTLE;