Aion-Enum
view release on metacpan or search on metacpan
lib/Aion/Enum.pm view on Meta::CPAN
package Aion::Enum;
use 5.22.0;
no strict; no warnings; no diagnostics;
use common::sense;
our $VERSION = "0.0.3";
use constant;
use Aion -role;
# ÐмпоÑÑ
sub import {
my $pkg = caller;
*{"${pkg}::issa"} = \&issa if $pkg->can('issa') != \&issa;
*{"${pkg}::case"} = \&case if $pkg->can('case') != \&case;
eval "package $pkg; use Aion -role; with 'Aion::Enum'; 1" or die
}
sub unimport {
my $pkg = caller;
undef &{"${pkg}::issa"};
undef &{"${pkg}::case"};
eval "package $pkg; no Aion; 1" or die
}
#@category СвойÑÑва
has name => (is => 'ro');
has value => (is => 'ro');
has stash => (is => 'ro');
has alias => (is => 'ro', default => sub {
my ($self) = @_;
$self->_alias->{$self->{name}};
});
#@category УпÑавленÑÑ
# СоздаÑÑ Ð¿ÐµÑеÑиÑление
sub case(@) {
my ($name, $value, $stash) = @_;
die "The case name must by 1+ simbol!" unless length $name;
my $pkg = caller;
my $meta = $Aion::META{$pkg};
my $issa = $meta->{issa};
my $enum = $meta->{enum} //= [];
$issa->{name}->validate($name, "$name name") if $issa->{name};
$issa->{value}->validate($value, "$name value") if $issa->{value};
$issa->{stash}->validate($stash, "$name stash") if $issa->{stash};
$issa->{alias}->validate($pkg->_alias->{$name}, "$name alias") if $issa->{alias};
my $case = bless {
name => $name,
defined($value)? (value => $value): (),
defined($stash)? (stash => $stash): (),
}, $pkg;
push @$enum, $case;
constant->import("${pkg}::$name", $case);
return;
}
# ÐадаÑÑ ÑÐ¸Ð¿Ñ Ð´Ð»Ñ value и stash
sub issa(@) {
my $pkg = caller;
my ($nameisa, $valueisa, $stashisa, $aliasisa) = map { ref $_ eq '' ? eval "package $pkg; $_" || die : $_ } @_;
$Aion::META{$pkg}{issa} = {
name => $nameisa,
value => $valueisa,
stash => $stashisa,
alias => $aliasisa,
};
return;
}
#@category ÐеÑеÑиÑлениÑ
# ÐеÑеÑиÑлениÑ
sub cases {
my ($cls) = @_;
@{$Aion::META{ref $cls || $cls}{enum}}
}
# Ðмена
sub names {
my ($cls) = @_;
map $_->{name}, $cls->cases
}
# ÐнаÑениÑ
sub values {
my ($cls) = @_;
map $_->{value}, $cls->cases
}
# ÐополнениÑ
sub stashes {
my ($cls) = @_;
map $_->{stash}, $cls->cases
}
# ÐÑевдонимÑ
sub aliases {
my ($cls) = @_;
map $_->alias, $cls->cases
}
my %ALIAS;
sub _alias {
my ($cls) = @_;
( run in 2.119 seconds using v1.01-cache-2.11-cpan-97f6503c9c8 )