Aion
view release on metacpan or search on metacpan
lib/Aion.md view on Meta::CPAN
ÐÑовеÑÑеÑ, ÑÑо в клаÑÑаÑ
, иÑполÑзÑÑÑиÑ
ÑÑÑ ÑолÑ, еÑÑÑ ÑказаннÑе подпÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð»Ð¸ ÑиÑи.
```perl
package Role::Alpha { use Aion -role;
requires qw/abc/;
}
package Omega1 { use Aion; with Role::Alpha; }
eval { Omega1->new }; $@ # ~> Requires abc of Role::Alpha
package Omega { use Aion;
with Role::Alpha;
sub abc { "abc" }
}
Omega->new->abc # => abc
```
## req ($name => @aspects)
ÐÑовеÑÑеÑ, ÑÑо в клаÑÑаÑ
, иÑполÑзÑÑÑиÑ
ÑÑÑ ÑолÑ, еÑÑÑ ÑказаннÑе ÑиÑи Ñ ÑказаннÑми аÑпекÑами.
```perl
package Role::Beta { use Aion -role;
req x => (is => 'rw', isa => Num);
}
package Omega2 { use Aion; with Role::Beta; }
eval { Omega2->new }; $@ # ~> Requires req x => \(is => 'rw', isa => Num\) of Role::Beta
package Omega3 { use Aion;
with Role::Beta;
has x => (is => 'rw', isa => Num, default => 12);
}
Omega3->new->x # -> 12
```
# ASPECTS
`use Aion` вклÑÑÐ°ÐµÑ Ð² модÑÐ»Ñ ÑледÑÑÑие аÑпекÑÑ Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² `has`:
## is => $permissions
* `ro` â ÑоздаÑÑ ÑолÑко геÑÑеÑ.
* `wo` â ÑоздаÑÑ ÑолÑко ÑеÑÑеÑ.
* `rw` â ÑоздаÑÑ Ð³ÐµÑÑÐµÑ Ð¸ ÑеÑÑеÑ.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ â `rw`.
ÐополниÑелÑнÑе ÑазÑеÑениÑ:
* `+` â ÑиÑа обÑзаÑелÑна в паÑамеÑÑаÑ
конÑÑÑÑкÑоÑа. `+` не иÑполÑзÑеÑÑÑ Ñ `-`.
* `-` â ÑиÑа не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑÑановлена ÑеÑез конÑÑÑÑкÑоÑ. '-' не иÑполÑзÑеÑÑÑ Ñ `+`.
* `*` â не инкÑеменÑиÑоваÑÑ ÑÑÑÑÑик ÑÑÑлок на знаÑение (пÑимениÑÑ `weaken` к знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле ÑÑÑановки его в ÑиÑÑ).
* `?` â ÑоздаÑÑ Ð¿ÑедикаÑ.
* `!` â ÑоздаÑÑ clearer.
```perl
package ExIs { use Aion;
has rw => (is => 'rw?!');
has ro => (is => 'ro+');
has wo => (is => 'wo-?');
}
ExIs->new # @-> ro required!
ExIs->new(ro => 10, wo => -10) # @-> wo excessive!
ExIs->new(ro => 10)->has_rw # -> ""
ExIs->new(ro => 10, rw => 20)->has_rw # -> 1
ExIs->new(ro => 10, rw => 20)->clear_rw->has_rw # -> ""
ExIs->new(ro => 10)->ro # -> 10
ExIs->new(ro => 10)->wo(30)->has_wo # -> 1
ExIs->new(ro => 10)->wo # @-> Feature wo cannot be get!
ExIs->new(ro => 10)->rw(30)->rw # -> 30
```
ФÑнкÑÐ¸Ñ Ñ `*` не ÑдеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð·Ð½Ð°Ñение:
```perl
package Node { use Aion;
has parent => (is => "rw*", isa => Maybe[Object["Node"]]);
}
my $root = Node->new;
my $node = Node->new(parent => $root);
$node->parent->parent # -> undef
undef $root;
$node->parent # -> undef
# And by setter:
$node->parent($root = Node->new);
$node->parent->parent # -> undef
undef $root;
$node->parent # -> undef
```
## isa => $type
УказÑÐ²Ð°ÐµÑ Ñип, а ÑоÑнее â валидаÑоÑ, ÑиÑи.
ÐÐ¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ:
* `Aion::Type` â Aion ÑÑÐ°Ð·Ñ Ð¸Ð¼Ð¿Ð¾ÑÑиÑÑÐµÑ Ð² Ð¿Ð°ÐºÐµÑ Ð²Ñе ÑÐ¸Ð¿Ñ Ð¸Ð· [Aion::Types](https://metacpan.org/pod/Aion::Types).
* СÑÑоки воÑпÑимаÑÑÑÑ ÐºÐ°Ðº пакеÑÑ Ð¸ обоÑаÑиваÑÑÑÑ Ð² `Object`.
* ÐодпÑогÑÐ°Ð¼Ð¼Ñ â ÑеÑÑиÑÑемое знаÑение пеÑедаÑÑÑÑ Ð² `$_` и подпÑогÑамма возвÑаÑÐ°ÐµÑ Ð±Ñлево знаÑение.
* ÐбÑекÑÑ Ñ Ð¿ÐµÑегÑÑженнÑм опеÑаÑоÑом `&{}`. ÐÑли Ñ Ñакого обÑекÑа еÑÑÑ ÐµÑÑ Ð¸ меÑод `coerce`, Ñо он бÑÐ´ÐµÑ ÑÑавÑÑвоваÑÑ Ð² пÑиведениÑÑ
, еÑли ÑказаÑÑ...
```perl
package Externalis {
use overload '&{}' => sub { sub { /^\d+$/ } };
( run in 1.116 second using v1.01-cache-2.11-cpan-ceb78f64989 )