Aion-Enum
view release on metacpan or search on metacpan
lib/Aion/Enum.pm view on Meta::CPAN
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) = @_;
$cls = ref $cls || $cls;
my $alias_ref = $ALIAS{$cls};
return $alias_ref if $alias_ref;
my $alias_ref = $ALIAS{$cls} = {};
my $path = $INC{($cls =~ s!::!/!gr) . ".pm"};
die "$cls not loaded!" unless $path;
open my $f, "<:utf8", $path or die "$path: $!";
my $alias;
my $id = '[a-zA-Z_]\w*';
while(<$f>) {
$alias = $1 if /^# (\S.*?)\s*$/;
do {
$alias_ref->{$+{id}} = $alias;
undef $alias;
} if /^case \s+ (
(?<id>$id)
| '(?<id>$id)'
| "(?<id>$id)"
| q[wq]? (?:
\{ (?<id>$id) \}
| \[ (?<id>$id) \]
| \( (?<id>$id) \)
| < (?<id>$id) >
| ([~!\@#$%^&*-+=\\\/|]) (?<id>$id) \2
)
)/x;
}
close $f;
$alias_ref
}
#@category ÐонÑÑÑÑкÑоÑÑ
# ÐолÑÑиÑÑ case по имени c иÑклÑÑением
sub fromName {
my ($cls, $name) = @_;
my $case = $cls->tryFromName($name);
die "Did not case with name `$name`!" unless defined $case;
$case
}
# ÐолÑÑиÑÑ case по имени
sub tryFromName {
my ($cls, $name) = @_;
my ($case) = grep { $_->{name} ~~ $name } $cls->cases;
$case
}
# ÐолÑÑиÑÑ case по знаÑÐµÐ½Ð¸Ñ c иÑклÑÑением
sub fromValue {
my ($cls, $value) = @_;
my $case = $cls->tryFromValue($value);
die "Did not case with value `$value`!" unless defined $case;
$case
}
# ÐолÑÑиÑÑ case по знаÑениÑ
sub tryFromValue {
my ($cls, $value) = @_;
my ($case) = grep { $_->{value} ~~ $value } $cls->cases;
$case
}
# ÐолÑÑиÑÑ case по знаÑÐµÐ½Ð¸Ñ c иÑклÑÑением
sub fromStash {
my ($cls, $stash) = @_;
my $case = $cls->tryFromStash($stash);
die "Did not case with stash `$stash`!" unless defined $case;
$case
}
# ÐолÑÑиÑÑ case по знаÑениÑ
sub tryFromStash {
my ($cls, $stash) = @_;
my ($case) = grep { $_->{stash} ~~ $stash } $cls->cases;
$case
}
# ÐолÑÑиÑÑ case по пÑÐµÐ²Ð´Ð¾Ð½Ð¸Ð¼Ñ c иÑклÑÑением
sub fromAlias {
my ($cls, $alias) = @_;
my $case = $cls->tryFromAlias($alias);
die "Did not case with alias `$alias`!" unless defined $case;
$case
}
# ÐолÑÑиÑÑ case по пÑевдонимÑ
sub tryFromAlias {
my ($cls, $alias) = @_;
my ($case) = grep { $_->{alias} ~~ $alias } $cls->cases;
$case
}
1;
__END__
=encoding utf-8
=head1 NAME
Aion :: Enum - Listing in the style of OOP, when each renewal is an object
=head1 VERSION
0.0.3
=head1 SYNOPSIS
File lib/StatusEnum.pm:
package StatusEnum;
use Aion::Enum;
# Active status
case active => 1, 'Active';
# Passive status
case passive => 2, 'Passive';
1;
use StatusEnum;
&StatusEnum::active->does('Aion::Enum') # => 1
StatusEnum->active->name # => active
StatusEnum->passive->value # => 2
StatusEnum->active->alias # => Active status
StatusEnum->passive->stash # => Passive
[ StatusEnum->cases ] # --> [StatusEnum->active, StatusEnum->passive]
[ StatusEnum->names ] # --> [qw/active passive/]
[ StatusEnum->values ] # --> [qw/1 2/]
[ StatusEnum->aliases ] # --> ['Active status', 'Passive status']
[ StatusEnum->stashes ] # --> [qw/Active Passive/]
=head1 DESCRIPTION
C<Aion :: Enum> allows you to create transfers-objects. These transfers may contain additional methods and properties. You can add roles to them (using C<with>) or use them as a role.
An important feature is the preservation of the procedure for listing.
C<Aion::Enum> is similar to php8 enums, but has the additional properties C<alias> and C<stash>.
=head1 SUBROUTINES
=head2 case ($name, [$value, [$stash]])
Creates a listing: his constant.
package OrderEnum {
use Aion::Enum;
case 'first';
( run in 0.785 second using v1.01-cache-2.11-cpan-13bb782fe5a )