Aion

 view release on metacpan or  search on metacpan

README.md  view on Meta::CPAN

404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
* `ro` — создать только геттер.
* `wo` — создать только сеттер.
* `rw` — создать геттер и сеттер.
 
По умолчанию — `rw`.
 
Дополнительные разрешения:
 
* `+` — фича обязательна в параметрах конструктора. `+` не используется с `-`.
* `-` — фича не может быть установлена через конструктор. '-' не используется с `+`.
* `*` — не инкрементировать счётчик ссылок на значение (применить `weaken` к значению после установки его в фичу).
 
```perl
package ExIs { use Aion;
    has rw => (is => 'rw');
    has ro => (is => 'ro+');
    has wo => (is => 'wo-');
}
 
eval { ExIs->new }; $@ # ~> \* Feature ro is required!
eval { ExIs->new(ro => 10, wo => -10) }; $@ # ~> \* Feature wo cannot set in new!

i18n/Aion.ru-en.po  view on Meta::CPAN

112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
msgid "По умолчанию — `rw`."
msgstr "By default - `rw`."
 
msgid "Дополнительные разрешения:"
msgstr "Additional permits:"
 
msgid ""
"* `+` — фича обязательна в параметрах конструктора. `+` не используется с `-`.\n"
"* `-` — фича не может быть установлена через конструктор. '-' не используется с `+`.\n"
"* `*` — не инкрементировать счётчик ссылок на значение (применить `weaken` к значению после установки его в фичу)."
msgstr ""
"* `+` - feature is required in the parameters of the designer. `+` is not used with `-`.\n"
"* `-` - a feature cannot be installed through the constructor. '-' is not used with `+`.\n"
"* `*` - do not increase the counter of links to the value (apply `weaken` to the value after installing it in a feature)."
 
msgid "Функция с `*` не удерживает значение:"
msgstr "The function with `*` does not hold the meaning:"
 
msgid "Указывает тип, а точнее – валидатор, фичи."
msgstr "Indicates the type, or rather - a validator, feature."
 
msgid "Список валидаторов см. в [Aion::Type](https://metacpan.org/pod/Aion::Type)."
msgstr "For a list of validators, see [Aion::Type](https://metacpan.org/pod/Aion:::Type)."

lib/Aion.md  view on Meta::CPAN

404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
* `ro` — создать только геттер.
* `wo` — создать только сеттер.
* `rw` — создать геттер и сеттер.
 
По умолчанию — `rw`.
 
Дополнительные разрешения:
 
* `+` — фича обязательна в параметрах конструктора. `+` не используется с `-`.
* `-` — фича не может быть установлена через конструктор. '-' не используется с `+`.
* `*` — не инкрементировать счётчик ссылок на значение (применить `weaken` к значению после установки его в фичу).
 
```perl
package ExIs { use Aion;
    has rw => (is => 'rw');
    has ro => (is => 'ro+');
    has wo => (is => 'wo-');
}
 
eval { ExIs->new }; $@ # ~> \* Feature ro is required!
eval { ExIs->new(ro => 10, wo => -10) }; $@ # ~> \* Feature wo cannot set in new!

lib/Aion.pm  view on Meta::CPAN

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Aion;
use 5.22.0;
no strict; no warnings; no diagnostics;
 
our $VERSION = "0.4";
 
use Scalar::Util qw/blessed weaken/;
use Aion::Types qw//;
 
# Когда осуществлять проверки:
#   ro - только при выдаче
#   wo - только при установке
#   rw - при выдаче и уcтановке
#   no - никогда не проверять
use config ISA => 'rw';
 
sub export($@);

lib/Aion.pm  view on Meta::CPAN

64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
}
 
# Экспортирует функции в пакет, если их там ещё нет
sub is_aion($) {
        my $pkg = shift;
        die "$pkg is'nt class of Aion!" if !exists $META{$pkg};
}
 
#@category Aspects
 
sub _weaken_init {
        my ($self, $feature) = @_;
        weaken $self->{$feature->{name}};
}
 
# ro, rw, + и -, *
sub is_aspect {
    my ($cls, $name, $is, $construct, $feature) = @_;
    die "Use is => '(ro|rw|wo|no)[+-]?[*]?'" if $is !~ /^(ro|rw|wo|no)[+-]?[*]?\z/;
 
    $construct->{get} = "die 'has: $name is $is (not get)'" if $is =~ /^(wo|no)/;
 
        if($is =~ /^(ro|no)/) {
        $construct->{set} = "die 'has: $name is $is (not set)'";
        }
        elsif($is =~ /\*\z/) {
                $construct->{ret} = "; Scalar::Util::weaken(\$self->{$name})$construct->{ret}";
        }
 
    $feature->{required} = 1 if $is =~ /\+/;
    $feature->{excessive} = 1 if $is =~ /-/;
    push @{$feature->{init}}, \&_weaken_init if $is =~ /\*\z/;
}
 
# isa => Type
sub isa_aspect {
    my ($cls, $name, $isa, $construct, $feature) = @_;
    die "has: $name - isa maybe Aion::Type"
        if !UNIVERSAL::isa($isa, 'Aion::Type');
 
    $feature->{isa} = $isa;

lib/Aion.pm  view on Meta::CPAN

868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
By default - C<rw>.
 
Additional permits:
 
=over
 
=item * C<+> - feature is required in the parameters of the designer. C<+> is not used with C<->.
 
=item * C<-> - a feature cannot be installed through the constructor. '-' is not used with C<+>.
 
=item * C<*> - do not increase the counter of links to the value (apply C<weaken> to the value after installing it in a feature).
 
=back
 
        package ExIs { use Aion;
            has rw => (is => 'rw');
            has ro => (is => 'ro+');
            has wo => (is => 'wo-');
        }
         
        eval { ExIs->new }; $@ # ~> \* Feature ro is required!

t/aion.t  view on Meta::CPAN

404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
# * `ro` — создать только геттер.
# * `wo` — создать только сеттер.
# * `rw` — создать геттер и сеттер.
#
# По умолчанию — `rw`.
#
# Дополнительные разрешения:
#
# * `+` — фича обязательна в параметрах конструктора. `+` не используется с `-`.
# * `-` — фича не может быть установлена через конструктор. '-' не используется с `+`.
# * `*` — не инкрементировать счётчик ссылок на значение (применить `weaken` к значению после установки его в фичу).
#
done_testing; }; subtest 'is => $permissions' => sub {
package ExIs { use Aion;
    has rw => (is => 'rw');
    has ro => (is => 'ro+');
    has wo => (is => 'wo-');
}
 
::like scalar do {eval { ExIs->new }; $@}, qr!\* Feature ro is required\!!, 'eval { ExIs->new }; $@ # ~> \* Feature ro is required!';
::like scalar do {eval { ExIs->new(ro => 10, wo => -10) }; $@}, qr!\* Feature wo cannot set in new\!!, 'eval { ExIs->new(ro => 10, wo => -10) }; $@ # ~> \* Feature wo cannot set in new!';



( run in 0.287 second using v1.01-cache-2.11-cpan-bb97c1e446a )