public static function valueNames(): array
    {
        static $valueNames = [];

        if (!isset($valueNames[static::class])) {
            $valueNames[static::class] = [];

            foreach ((new ReflectionClass(static::class))->getReflectionConstants() as $reflectionConstant) {
                if ($reflectionConstant->isPublic() && !$reflectionConstant->getDeclaringClass()->isInterface()) {
                    $valueNames[static::class][] = $reflectionConstant->name;
                }
            }
        }

        return $valueNames[static::class];
    }