Aion
view release on metacpan or search on metacpan
## pleroma ()
ÐозвÑаÑÐ°ÐµÑ Ð»Ð¾ÐºÐ°ÑоÑ.
```perl
Aion->pleroma->isa('Aion::Pleroma') # -> 1
```
# SUBROUTINES IN CLASSES
## extends (@superclasses)
РаÑÑиÑÑÐµÑ ÐºÐ»Ð°ÑÑ Ð´ÑÑгим клаÑÑом/клаÑÑами. Ðн вÑзÑÐ²Ð°ÐµÑ Ð¸Ð· каждого наÑледÑемого клаÑÑа меÑод `import_extends`, еÑли он в нÑм еÑÑÑ.
```perl
package World { use Aion;
our $extended_by_this = 0;
sub import_extends {
my ($class, $extends) = @_;
$extended_by_this ++;
$class # => World
$extends # => Hello
}
}
package Hello { use Aion;
extends q/World/;
$World::extended_by_this # -> 1
}
Hello->isa("World") # -> 1
```
## new (%param)
ÐонÑÑÑÑкÑоÑ.
* УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ `%param` Ð´Ð»Ñ ÑиÑ.
* ÐÑовеÑÑеÑ, ÑÑо паÑамеÑÑÑ ÑооÑвеÑÑÑвÑÑÑ ÑиÑам.
* УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ.
```perl
package NewExample { use Aion;
has x => (is => 'ro', isa => Num);
has y => (is => 'ro+', isa => Num);
has z => (is => 'ro-', isa => Num);
}
NewExample->new(f => 5) # @-> y required!
NewExample->new(f => 5, y => 10) # @-> f is'nt feature!
NewExample->new(f => 5, p => 6, y => 10) # @-> f, p is'nt features!
NewExample->new(z => 10, y => 10) # @-> z excessive!
my $ex = NewExample->new(y => 8);
$ex->x # @-> Get feature x must have the type Num. The it is undef!
$ex = NewExample->new(x => 10.1, y => 8);
$ex->x # -> 10.1
```
# SUBROUTINES IN ROLES
## requires (@subroutine_names)
ÐÑовеÑÑеÑ, ÑÑо в клаÑÑаÑ
, иÑполÑзÑÑÑиÑ
ÑÑÑ ÑолÑ, еÑÑÑ ÑказаннÑе подпÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð»Ð¸ ÑиÑи.
```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
```
## Ð Ð¾Ð»Ñ Ð½Ð°ÑледÑÐµÑ ÑолÑ
Ð Ð¾Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°ÑледоваÑÑ Ð´ÑÑгÑÑ ÑÐ¾Ð»Ñ ÑеÑез `with`. Так можно ÑÑоÑнÑÑÑ Ð¸Ð½ÑеÑÑейÑ: ÑÐ¸Ð¿Ñ ÑÑебÑÑÑиÑ
ÑÑ ÑиÑей (`req`) и меÑодов (`:Isa`) либо оÑÑаÑÑÑÑ ÑакÐ...
Ð Ð¾Ð»Ñ `Role::Animal` ÑÑебÑÐµÑ ÑвойÑÑво `legs` ÑиÑокого Ñипа `Num | Object` и меÑод `sound` Ñ ÑигнаÑÑÑой `(Me => Str)`.
Num < (Num | Object) # -> 1
}
my $sparrow = Ex::Sparrow->new;
$sparrow->legs # => 2
$sparrow->sound # => chirp
```
# 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+$/ } };
sub coerce { int $_ }
}
package ExIsa { use Aion;
has x => (isa => Int);
has y => (isa => sub { /^\d+$/ });
has z => (isa => bless({}, 'Externalis'), coerce => 1);
}
ExIsa->new(x => 'str') # @-> Set feature x must have the type Int. The it is 'str'!
ExIsa->new->x # @-> Get feature x must have the type Int. The it is undef!
ExIsa->new(x => 10)->x # -> 10
ExIsa->new(y => 'abc') # @-> Set feature y must have the type External[CODE
ExIsa->new(z => ' 6 xyz')->z # -> 6
```
## coerce => (1|0)
ÐклÑÑÐ°ÐµÑ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñипов.
```perl
package ExCoerce { use Aion;
has x => (is => 'ro', isa => Int, coerce => 1);
}
ExCoerce->new(x => 10.4)->x # -> 10
ExCoerce->new(x => 10.5)->x # -> 11
```
## default => $value
ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÑанавливаеÑÑÑ Ð² конÑÑÑÑкÑоÑе, еÑли паÑамеÑÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑиÑи оÑÑÑÑÑÑвÑеÑ.
```perl
package ExDefault { use Aion;
has x => (is => 'ro', default => 10);
}
ExDefault->new->x # -> 10
ExDefault->new(x => 20)->x # -> 20
```
ÐÑли `$value` ÑвлÑеÑÑÑ Ð¿Ð¾Ð´Ð¿ÑогÑаммой, Ñо подпÑогÑамма ÑÑиÑаеÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑом знаÑÐµÐ½Ð¸Ñ ÑиÑи. ÐÑполÑзÑеÑÑÑ Ð»ÐµÐ½Ð¸Ð²Ð¾Ðµ вÑÑиÑление, еÑли Ð½ÐµÑ Ð°ÑÑ...
```perl
my $count = 10;
package ExLazy { use Aion;
has x => (default => sub {
my ($self) = @_;
++$count
});
}
my $ex = ExLazy->new;
$count # -> 10
$ex->x # -> 11
$count # -> 11
$ex->x # -> 11
$count # -> 11
```
## lazy => (1|0)
ÐÑÐ¿ÐµÐºÑ `lazy` вклÑÑÐ°ÐµÑ Ð¸Ð»Ð¸ оÑклÑÑÐ°ÐµÑ Ð»ÐµÐ½Ð¸Ð²Ð¾Ðµ вÑÑиÑление знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ (`default`).
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð½ вклÑÑен ÑолÑко еÑли знаÑение по ÑмолÑÐ°Ð½Ð¸Ñ ÑвлÑеÑÑÑ Ð¿Ð¾Ð´Ð¿ÑогÑаммой.
```perl
package ExLazy0 { use Aion;
package ExLazy1 { use Aion;
has x => (is => 'ro?', lazy => 1, default => 6);
}
my $ex1 = ExLazy1->new;
$ex1->has_x # -> ""
$ex1->x # -> 6
```
## eon => (1|2|$key)
С помоÑÑÑ Ð°ÑпекÑа `eon` ÑеализÑеÑÑÑ Ð¿Ð°ÑÑеÑн **Dependency Injection**.
Ðн ÑвÑзÑÐ²Ð°ÐµÑ ÑвойÑÑво Ñ ÑеÑвиÑом из конÑейнеÑа `Aion->pleroma`.
ÐнаÑением аÑпекÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÐºÐ»ÑÑ ÑеÑвиÑа, 1 или 2.
* ÐÑли 1 â Ñогда клÑÑÑм бÑÐ´ÐµÑ Ð¿Ð°ÐºÐµÑ Ð² `isa => Object['Packet']`.
* ÐÑли 2 â Ñогда клÑÑÑм бÑÐ´ÐµÑ "пакеÑ#ÑвойÑÑво".
Файл lib/CounterEon.pm:
```perl
package CounterEon;
#@eon ex.counter
use Aion;
has accomulator => (isa => 'AccomulatorEon', eon => 1);
1;
```
Файл lib/AccomulatorEon.pm:
```perl
package AccomulatorEon;
#@eon
use Aion;
has power => (isa => 'PowerEon', eon => 2);
1;
```
Файл lib/PowerEon.pm:
```perl
package PowerEon;
use Aion;
has counter => (eon => 'ex.counter');
#@eon
sub power { shift->new }
1;
```
ÐÑполÑзÑем плеÑÐ¾Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ñно:
```perl
{
use Aion::Pleroma;
my $pleroma = Aion::Pleroma->new(ini => undef, pleroma => {
'ex.counter' => 'CounterEon#new',
AccomulatorEon => 'AccomulatorEon#new',
'PowerEon#power' => 'PowerEon#power',
});
local *Aion::pleroma = sub { $pleroma };
my $counter = Aion->pleroma->get('ex.counter');
$counter->accomulator->power->counter # -> $counter
}
Aion->pleroma->get('ex.counter') # -> undef
```
См. [Aion::Pleroma](https://metacpan.org/pod/Aion::Pleroma).
## trigger => $sub
`$sub` вÑзÑваеÑÑÑ Ð¿Ð¾Ñле ÑÑÑановки ÑвойÑÑва в конÑÑÑÑкÑоÑе (`new`) или ÑеÑез ÑеÑÑеÑ.
ÐÑÐ¸Ð¼Ð¾Ð»Ð¾Ð³Ð¸Ñ `trigger` â впÑÑÑиÑÑ.
```perl
package ExTrigger { use Aion;
has x => (trigger => sub {
my ($self, $old_value) = @_;
$self->y($old_value + $self->x);
});
has y => ();
}
my $ex = ExTrigger->new(x => 10);
$ex->y # -> 10
$ex->x(20);
$ex->y # -> 30
```
## release => $sub
`$sub` вÑзÑваеÑÑÑ Ð¿ÐµÑед возвÑаÑом ÑвойÑÑва из обÑекÑа ÑеÑез геÑÑеÑ.
ÐÑÐ¸Ð¼Ð¾Ð»Ð¾Ð³Ð¸Ñ `release` â вÑпÑÑÑиÑÑ.
```perl
package ExRelease { use Aion;
has x => (release => sub {
my ($self, $value) = @_;
$_[1] = $value + 1;
});
}
my $ex = ExRelease->new(x => 10);
$ex->x # -> 11
```
## init_arg => $name
ÐенÑÐµÑ Ð¸Ð¼Ñ ÑвойÑÑва в конÑÑÑÑкÑоÑе.
```perl
package ExInitArg { use Aion;
has x => (is => 'ro+', init_arg => 'init_x');
ExInitArg->new(init_x => 10)->x # -> 10
}
```
## accessor => $name
ÐенÑÐµÑ Ð¸Ð¼Ñ Ð°ÐºÑеÑÑоÑа.
СоздаÑÑ Ð³ÐµÑÑÐµÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ `$name` Ð´Ð»Ñ ÑвойÑÑва.
```perl
package ExReader { use Aion;
has x => (is => 'wo', reader => '_get_x');
ExReader->new(x => 10)->_get_x # -> 10
}
```
## predicate => $name
СоздаÑÑ Ð¿ÑÐµÐ´Ð¸ÐºÐ°Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ `$name` Ð´Ð»Ñ ÑвойÑÑва. СоздаÑÑ Ð¿ÑÐµÐ´Ð¸ÐºÐ°Ñ Ñо ÑÑандаÑÑнÑм именем можно Ñак же ÑеÑез `is => '?'`.
```perl
package ExPredicate { use Aion;
has x => (predicate => '_has_x');
my $ex = ExPredicate->new;
$ex->_has_x # -> ""
$ex->x(10)->_has_x # -> 1
}
```
## clearer => $name
СоздаÑÑ Ð¾ÑиÑÑиÑÐµÐ»Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ `$name` Ð´Ð»Ñ ÑвойÑÑва. СоздаÑÑ Ð¾ÑиÑÑиÑÐµÐ»Ñ Ñо ÑÑандаÑÑнÑм именем можно Ñак же ÑеÑез `is => '!'`.
```perl
package ExClearer { use Aion;
has x => (is => '?', clearer => 'clear_x_');
}
my $ex = ExClearer->new;
$ex->has_x # -> ""
$ex->clear_x_;
$ex->has_x # -> ""
$ex->x(10);
$ex->has_x # -> 1
$ex->clear_x_;
$ex->has_x # -> ""
```
## cleaner => $sub
`$sub` вÑзÑваеÑÑÑ Ð¿Ñи вÑзове декÑÑÑÑкÑоÑа или `$object->clear_feature`, но ÑолÑко еÑли ÑвойÑÑво имееÑÑÑ (Ñм. `$object->has_feature`).
ÐаннÑй аÑÐ¿ÐµÐºÑ Ð¿ÑинÑдиÑелÑно ÑоздаÑÑ Ð¿ÑÐµÐ´Ð¸ÐºÐ°Ñ Ð¸ clearer.
```perl
package ExCleaner { use Aion;
our $x;
has x => (is => '!', cleaner => sub {
my ($self) = @_;
$x = $self->x
});
}
$ExCleaner::x # -> undef
ExCleaner->new(x => 10);
$ExCleaner::x # -> 10
my $ex = ExCleaner->new(x => 12);
$ExCleaner::x # -> 10
$ex->clear_x;
$ExCleaner::x # -> 12
undef $ex;
$ExCleaner::x # -> 12
```
# ATTRIBUTES
`Aion` добавлÑÐµÑ Ð² Ð¿Ð°ÐºÐµÑ ÑнивеÑÑалÑнÑе аÑÑибÑÑÑ.
## :Isa (@signature)
ÐÑÑибÑÑ `Isa` пÑовеÑÑÐµÑ ÑигнаÑÑÑÑ ÑÑнкÑии.
```perl
package MaybeCat { use Aion;
sub is_cat : Isa(Me => Str => Bool) {
my ($self, $anim) = @_;
$anim =~ /(cat)/
}
}
my $anim = MaybeCat->new;
$anim->is_cat('cat') # -> 1
$anim->is_cat('dog') # -> ""
MaybeCat->is_cat("cat") # @-> Arguments of method `is_cat` must have the type Tuple[Me, Str].
my @items = $anim->is_cat("cat") # @-> Returns of method `is_cat` must have the type Tuple[Bool].
```
ÐÑÑибÑÑ Isa позволÑÐµÑ Ð¾Ð±ÑÑвиÑÑ ÑÑебÑемÑе ÑÑнкÑии:
```perl
package Anim { use Aion -role;
sub is_cat : Isa(Me => Bool);
}
package Cat { use Aion; with qw/Anim/;
sub is_cat : Isa(Me => Bool) { 1 }
}
package Dog { use Aion; with qw/Anim/;
sub is_cat : Isa(Me => Bool) { 0 }
}
package Mouse { use Aion; with qw/Anim/;
sub is_cat : Isa(Me => Int) { 0 }
}
Cat->new->is_cat # -> 1
Dog->new->is_cat # -> 0
Mouse->new # @-> Signature mismatch: is_cat(Me => Bool) of Anim <=> is_cat(Me => Int) of Mouse
```
# SEE ALSO
ÐкоÑиÑÑема Aion:
( run in 1.347 second using v1.01-cache-2.11-cpan-d80b1682f3f )