Add metadata to enum cases with Metadata trait
masterThe Metadata trait allows you to attach custom attributes (meta properties) to enum cases and access them via methods on the enum instance.
Implementation Steps
- Define meta property classes extending
MetaProperty. - Use the
#[Meta(...)]attribute on the enum to register the properties. - Apply attributes to specific cases.
Customizing Meta Properties
method(): Override to change the name of the generated getter method (e.g.,Descriptionbecomesnote()instead ofdescription()).transform(mixed $value): Override to modify the value returned by the getter.defaultValue(): Specify a value to return if a case does not have the attribute applied.
Accessing Metadata
TaskStatus::CASE->propertyName()TaskStatus::fromMeta(MetaPropertyInstance): Returns the enum case matching the metadata.TaskStatus::tryFromMeta(MetaPropertyInstance): Returns the enum case ornull.
use ArchTech\Enums\Metadata;
use ArchTech\Enums\Meta\Meta;
use ArchTech\Enums\Meta\MetaProperty;
#[Attribute]
class Color extends MetaProperty
{
protected function transform(mixed $value): mixed
{
return "text-{$value}-500";
}
}
#[Meta(Color::class)]
enum TaskStatus: int
{
use Metadata;
#[Color('red')]
case INCOMPLETE = 0;
#[Color('green')]
case COMPLETED = 1;
}
TaskStatus::COMPLETED->color(); // 'text-green-500'
// Finding case by metadata
TaskStatus::fromMeta(Color::make('green')); // TaskStatus::COMPLETED