public static final function get($value)
{
if ($value instanceof static && get_class($value) === get_called_class()) {
return $value;
}
$class = get_called_class();
$constants = self::detectConstants($class);
$name = array_search($value, $constants, true);
if ($name === false) {
$message = is_scalar($value) ? 'Unknown value ' . var_export($value, true) : 'Invalid value of type ' . (is_object($value) ? get_class($value) : gettype($value));
throw new InvalidArgumentException($message);
}
if (!isset(self::$instances[$class][$name])) {
self::$instances[$class][$name] = new $class($constants[$name]);
}
return self::$instances[$class][$name];
}