Aion
view release on metacpan or search on metacpan
404405406407408409410411412413414415416417418419420421422423424* `ro` — Ñоздать только геттер.
* `wo` — Ñоздать только Ñеттер.
* `rw` — Ñоздать геттер и Ñеттер.
По умолчанию — `rw`.
Дополнительные разрешениÑ:
* `+` — фича обÑзательна в параметрах конÑтруктора. `+` не иÑпользуетÑÑ Ñ `-`.
* `-` — фича не может быть уÑтановлена через конÑтруктор.
'-'
не иÑпользуетÑÑ Ñ `+`.
* `*` — не инкрементировать Ñчётчик ÑÑылок на значение (применить `weaken` к значению поÑле уÑтановки его в фичу).
```perl
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
112113114115116117118119120121122123124125126127128129130131132133134135msgid
"По умолчанию — `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
404405406407408409410411412413414415416417418419420421422423424* `ro` — Ñоздать только геттер.
* `wo` — Ñоздать только Ñеттер.
* `rw` — Ñоздать геттер и Ñеттер.
По умолчанию — `rw`.
Дополнительные разрешениÑ:
* `+` — фича обÑзательна в параметрах конÑтруктора. `+` не иÑпользуетÑÑ Ñ `-`.
* `-` — фича не может быть уÑтановлена через конÑтруктор.
'-'
не иÑпользуетÑÑ Ñ `+`.
* `*` — не инкрементировать Ñчётчик ÑÑылок на значение (применить `weaken` к значению поÑле уÑтановки его в фичу).
```perl
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
123456789101112131415161718package
Aion;
use
5.22.0;
no
strict;
no
warnings;
no
diagnostics;
use
common::sense;
our
$VERSION
=
"0.4"
;
# Когда оÑущеÑтвлÑть проверки:
# ro - только при выдаче
# wo - только при уÑтановке
# rw - при выдаче и уcтановке
# no - никогда не проверÑть
sub
export($@);
lib/Aion.pm view on Meta::CPAN
646566676869707172737475767778798081828384858687888990919293949596979899100101102103104}
# ÐкÑпортирует функции в пакет, еÑли их там ещё нет
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
868869870871872873874875876877878879880881882883884885886887888By
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!
404405406407408409410411412413414415416417418419420421422423424# * `ro` — Ñоздать только геттер.
# * `wo` — Ñоздать только Ñеттер.
# * `rw` — Ñоздать геттер и Ñеттер.
#
# По умолчанию — `rw`.
#
# Дополнительные разрешениÑ:
#
# * `+` — фича обÑзательна в параметрах конÑтруктора. `+` не иÑпользуетÑÑ Ñ `-`.
# * `-` — фича не может быть уÑтановлена через конÑтруктор. '-' не иÑпользуетÑÑ Ñ `+`.
# * `*` — не инкрементировать Ñчётчик ÑÑылок на значение (применить `weaken` к значению поÑле уÑтановки его в фичу).
#
done_testing; }; subtest
'is => $permissions'
=>
sub
{
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 )