Aion
view release on metacpan or search on metacpan
#
# ## Ð Ð¾Ð»Ñ Ð½Ð°ÑледÑÐµÑ ÑолÑ
#
# Ð Ð¾Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°ÑледоваÑÑ Ð´ÑÑгÑÑ ÑÐ¾Ð»Ñ ÑеÑез `with`. Так можно ÑÑоÑнÑÑÑ Ð¸Ð½ÑеÑÑейÑ: ÑÐ¸Ð¿Ñ ÑÑебÑÑÑиÑ
ÑÑ ÑиÑей (`req`) и меÑодов (`:Isa`) либо оÑÑаÑÑÑÑ ÑаÐ...
#
# Ð Ð¾Ð»Ñ `Role::Animal` ÑÑебÑÐµÑ ÑвойÑÑво `legs` ÑиÑокого Ñипа `Num | Object` и меÑод `sound` Ñ ÑигнаÑÑÑой `(Me => Str)`.
#
::done_testing; }; subtest 'Ð Ð¾Ð»Ñ Ð½Ð°ÑледÑÐµÑ ÑолÑ' => sub {
package Role::Animal { use Aion -role;
req legs => (isa => Num | Object);
sub sound : Isa(Me => Str);
}
#
# Ð Ð¾Ð»Ñ `Role::Bird` наÑледÑÐµÑ `Role::Animal`, но Ð¿Ð¾Ð½Ð¸Ð¶Ð°ÐµÑ Ñип `legs` до `Num`, а ÑигнаÑÑÑÑ Ð¼ÐµÑода `sound` оÑÑавлÑÐµÑ Ð¿Ñежней.
#
package Role::Bird { use Aion -role;
with qw/Role::Animal/;
req legs => (isa => Num);
sub sound : Isa(Me => Str);
}
#
# ÐлаÑÑ `Ex::Sparrow` иÑполÑзÑÐµÑ ÑÐ¾Ð»Ñ `Role::Bird` и ÑеализÑÐµÑ Ð²Ñе ÐµÑ ÑÑебованиÑ.
#
package Ex::Sparrow { use Aion;
with qw/Role::Bird/;
has legs => (is => 'ro', isa => Num, default => 2);
sub sound : Isa(Me => Str) { 'chirp' }
local ($::_g0 = do {Num < (Num | Object)}, $::_e0 = do {1}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, ' Num < (Num | Object) # -> 1' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
}
my $sparrow = Ex::Sparrow->new;
local ($::_g0 = do {$sparrow->legs}, $::_e0 = "2"); ::ok $::_g0 eq $::_e0, '$sparrow->legs # => 2' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {$sparrow->sound}, $::_e0 = "chirp"); ::ok $::_g0 eq $::_e0, '$sparrow->sound # => chirp' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# # ASPECTS
#
# `use Aion` вклÑÑÐ°ÐµÑ Ð² модÑÐ»Ñ ÑледÑÑÑие аÑпекÑÑ Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² `has`:
#
# ## is => $permissions
#
# * `ro` â ÑоздаÑÑ ÑолÑко геÑÑеÑ.
# * `wo` â ÑоздаÑÑ ÑолÑко ÑеÑÑеÑ.
# * `rw` â ÑоздаÑÑ Ð³ÐµÑÑÐµÑ Ð¸ ÑеÑÑеÑ.
#
# Ðо ÑмолÑÐ°Ð½Ð¸Ñ â `rw`.
#
# ÐополниÑелÑнÑе ÑазÑеÑениÑ:
#
# * `+` â ÑиÑа обÑзаÑелÑна в паÑамеÑÑаÑ
конÑÑÑÑкÑоÑа. `+` не иÑполÑзÑеÑÑÑ Ñ `-`.
# * `-` â ÑиÑа не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑÑановлена ÑеÑез конÑÑÑÑкÑоÑ. '-' не иÑполÑзÑеÑÑÑ Ñ `+`.
# * `*` â не инкÑеменÑиÑоваÑÑ ÑÑÑÑÑик ÑÑÑлок на знаÑение (пÑимениÑÑ `weaken` к знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле ÑÑÑановки его в ÑиÑÑ).
# * `?` â ÑоздаÑÑ Ð¿ÑедикаÑ.
# * `!` â ÑоздаÑÑ clearer.
#
::done_testing; }; subtest 'is => $permissions' => sub {
package ExIs { use Aion;
has rw => (is => 'rw?!');
has ro => (is => 'ro+');
has wo => (is => 'wo-?');
}
eval {ExIs->new}; local ($::_g0 = $@, $::_e0 = 'ro required!'); ok defined($::_g0) && $::_g0 =~ /^${\quotemeta $::_e0}/, 'ExIs->new # @-> ro required!' or ::diag ::_string_diff($::_g0, $::_e0, 1); undef $::_g0; undef $::_e0;
eval {ExIs->new(ro => 10, wo => -10)}; local ($::_g0 = $@, $::_e0 = 'wo excessive!'); ok defined($::_g0) && $::_g0 =~ /^${\quotemeta $::_e0}/, 'ExIs->new(ro => 10, wo => -10) # @-> wo excessive!' or ::diag ::_string_diff($::_g0, $::_e0, 1); undef $::...
local ($::_g0 = do {ExIs->new(ro => 10)->has_rw}, $::_e0 = do {""}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, 'ExIs->new(ro => 10)->has_rw # -> ""' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {ExIs->new(ro => 10, rw => 20)->has_rw}, $::_e0 = do {1}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, 'ExIs->new(ro => 10, rw => 20)->has_rw # -> 1' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $:...
local ($::_g0 = do {ExIs->new(ro => 10, rw => 20)->clear_rw->has_rw}, $::_e0 = do {""}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, 'ExIs->new(ro => 10, rw => 20)->clear_rw->has_rw # -> ""' or ::diag ::_struct_diff($::_g0, $::_e0); ...
local ($::_g0 = do {ExIs->new(ro => 10)->ro}, $::_e0 = do {10}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, 'ExIs->new(ro => 10)->ro # -> 10' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {ExIs->new(ro => 10)->wo(30)->has_wo}, $::_e0 = do {1}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, 'ExIs->new(ro => 10)->wo(30)->has_wo # -> 1' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0...
eval {ExIs->new(ro => 10)->wo}; local ($::_g0 = $@, $::_e0 = 'Feature wo cannot be get!'); ok defined($::_g0) && $::_g0 =~ /^${\quotemeta $::_e0}/, 'ExIs->new(ro => 10)->wo # @-> Feature wo cannot be get!' or ::diag ::_string_diff($::_g0, $::_e0, 1);...
local ($::_g0 = do {ExIs->new(ro => 10)->rw(30)->rw}, $::_e0 = do {30}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, 'ExIs->new(ro => 10)->rw(30)->rw # -> 30' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ФÑнкÑÐ¸Ñ Ñ `*` не ÑдеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð·Ð½Ð°Ñение:
#
package Node { use Aion;
has parent => (is => "rw*", isa => Maybe[Object["Node"]]);
}
my $root = Node->new;
my $node = Node->new(parent => $root);
local ($::_g0 = do {$node->parent->parent}, $::_e0 = do {undef}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '$node->parent->parent # -> undef' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
undef $root;
local ($::_g0 = do {$node->parent}, $::_e0 = do {undef}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '$node->parent # -> undef' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
# And by setter:
$node->parent($root = Node->new);
local ($::_g0 = do {$node->parent->parent}, $::_e0 = do {undef}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '$node->parent->parent # -> undef' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
undef $root;
local ($::_g0 = do {$node->parent}, $::_e0 = do {undef}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '$node->parent # -> undef' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ## isa => $type
#
# УказÑÐ²Ð°ÐµÑ Ñип, а ÑоÑнее â валидаÑоÑ, ÑиÑи.
#
# ÐÐ¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ:
#
# * `Aion::Type` â Aion ÑÑÐ°Ð·Ñ Ð¸Ð¼Ð¿Ð¾ÑÑиÑÑÐµÑ Ð² Ð¿Ð°ÐºÐµÑ Ð²Ñе ÑÐ¸Ð¿Ñ Ð¸Ð· [Aion::Types](https://metacpan.org/pod/Aion::Types).
# * СÑÑоки воÑпÑимаÑÑÑÑ ÐºÐ°Ðº пакеÑÑ Ð¸ обоÑаÑиваÑÑÑÑ Ð² `Object`.
# * ÐодпÑогÑÐ°Ð¼Ð¼Ñ â ÑеÑÑиÑÑемое знаÑение пеÑедаÑÑÑÑ Ð² `$_` и подпÑогÑамма возвÑаÑÐ°ÐµÑ Ð±Ñлево знаÑение.
# * ÐбÑекÑÑ Ñ Ð¿ÐµÑегÑÑженнÑм опеÑаÑоÑом `&{}`. ÐÑли Ñ Ñакого обÑекÑа еÑÑÑ ÐµÑÑ Ð¸ меÑод `coerce`, Ñо он бÑÐ´ÐµÑ ÑÑавÑÑвоваÑÑ Ð² пÑиведениÑÑ
, еÑли ÑказаÑ...
#
::done_testing; }; subtest 'isa => $type' => sub {
package Externalis {
use overload '&{}' => sub { sub { /^\d+$/ } };
( run in 0.943 second using v1.01-cache-2.11-cpan-364913b4093 )