Aion-Enum

 view release on metacpan or  search on metacpan

README.md  view on Meta::CPAN


Aion::Enum - перечисления в стиле ООП, когда каждое перечсление является объектом

# VERSION

0.0.3

# SYNOPSIS

Файл lib/StatusEnum.pm:
```perl
package StatusEnum;

use Aion::Enum;

# Active status
case active => 1, 'Active';

# Passive status
case passive => 2, 'Passive';

1;
```

```perl
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/]
```

# DESCRIPTION

`Aion::Enum` позволяет создавать перечисления-объекты. Данные перечисления могут содержать дополнительные методы и свойства. В них можно доб...

Важной особенностью является сохранение порядка перечисления.

`Aion::Enum` подобен перечислениям из php8, но имеет дополнительные свойства `alias` и `stash`.

# SUBROUTINES

## case ($name, [$value, [$stash]])

Создаёт перечисление: его константу.

```perl
package OrderEnum {
    use Aion::Enum;

    case 'first';
    case second => 2;
    case other  => 3, {data => 123};
}

&OrderEnum::first->name  # => first
&OrderEnum::first->value # -> undef
&OrderEnum::first->stash # -> undef

&OrderEnum::second->name  # => second
&OrderEnum::second->value # -> 2
&OrderEnum::second->stash # -> undef

&OrderEnum::other->name  # => other
&OrderEnum::other->value # -> 3
&OrderEnum::other->stash # --> {data => 123}
```

## issa ($nameisa, [$valueisa], [$stashisa], [$aliasisa])

Указывает тип (isa) значений и дополнений.

Её название – отсылка к богине Иссе из повести «Под лунами Марса» Берроуза.

```perl
eval {
package StringEnum;
    use Aion::Enum;

    issa Str => Int => Undef => Undef;

    case active => "Active";
};
$@ # ~> active value must have the type Int. The it is 'Active'

eval {
package StringEnum;
    use Aion::Enum;

    issa Str => Str => Int;

    case active => "Active", "Passive";
};
$@ # ~> active stash must have the type Int. The it is 'Passive'
```

Файл lib/StringEnum.pm:
```perl
package StringEnum;
use Aion::Enum;

issa Str => Undef => Undef => StrMatch[qr/^[A-Z]/];

# pushkin
case active => ;

1;
```

```perl
require StringEnum # @-> active alias must have the type StrMatch[qr/^[A-Z]/]. The it is 'pushkin'!
```

# CLASS METHODS

## cases ($cls)

Список перечислений.

```perl
[ OrderEnum->cases ] # --> [OrderEnum->first, OrderEnum->second, OrderEnum->other]
```

## names ($cls)

Имена перечислений.

```perl
[ OrderEnum->names ] # --> [qw/first second other/]
```

## values ($cls)

Значения перечислений.

```perl
[ OrderEnum->values ] # --> [undef, 2, 3]
```

## stashes ($cls)

Дополнения перечислений.

```perl
[ OrderEnum->stashes ] # --> [undef, undef, {data => 123}]
```

## aliases ($cls)

Псевдонимы перечислений.

Файл lib/AuthorEnum.pm:
```perl
package AuthorEnum;

use Aion::Enum;

# Pushkin Aleksandr Sergeevich
case pushkin =>;

# Yacheykin Uriy
case yacheykin =>;

case nouname =>;

1;
```

```perl
require AuthorEnum;
[ AuthorEnum->aliases ] # --> ['Pushkin Aleksandr Sergeevich', 'Yacheykin Uriy', undef]
```

## fromName ($cls, $name)

Получить case по имени c исключением.

```perl
OrderEnum->fromName('first') # -> OrderEnum->first
eval { OrderEnum->fromName('not_exists') }; $@ # ~> Did not case with name `not_exists`!
```

## tryFromName ($cls, $name)

Получить case по имени.

```perl
OrderEnum->tryFromName('first')      # -> OrderEnum->first
OrderEnum->tryFromName('not_exists') # -> undef



( run in 2.126 seconds using v1.01-cache-2.11-cpan-0bb4e1dffa6 )