1
0
Fork 0
mirror of https://github.com/archtechx/enums.git synced 2025-12-15 05:24:05 +00:00

Metadata (#8)

* Metadata

* Fix code style (php-cs-fixer)

* Code style

Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
This commit is contained in:
Samuel Štancl 2022-03-29 20:11:06 +02:00 committed by GitHub
parent cc5bba1912
commit 55478c4eb7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 400 additions and 46 deletions

45
src/Metadata.php Normal file
View file

@ -0,0 +1,45 @@
<?php
declare(strict_types=1);
namespace ArchTech\Enums;
use ArchTech\Enums\Meta\MetaProperty;
use ValueError;
trait Metadata
{
/** Try to get the first case with this meta property value. */
public static function tryFromMeta(MetaProperty $metaProperty): static|null
{
foreach (static::cases() as $case) {
if (Meta\Reflection::metaValue($metaProperty::class, $case) === $metaProperty->value) {
return $case;
}
}
return null;
}
/** Get the first case with this meta property value. */
public static function fromMeta(MetaProperty $metaProperty): static
{
return static::tryFromMeta($metaProperty) ?? throw new ValueError(
'Enum ' . static::class . ' does not have a case with a meta property "' .
$metaProperty::class . '" of value "' . $metaProperty->value . '"'
);
}
public function __call(string $property, $arguments): mixed
{
$metaProperties = Meta\Reflection::metaProperties($this);
foreach ($metaProperties as $metaProperty) {
if ($metaProperty::method() === $property) {
return Meta\Reflection::metaValue($metaProperty, $this);
}
}
return null;
}
}