Aion

 view release on metacpan or  search on metacpan

README.md  view on Meta::CPAN

* `ro` — создать только геттер.
* `wo` — создать только сеттер.
* `rw` — создать геттер и сеттер.

По умолчанию — `rw`.

Дополнительные разрешения:

* `+` — фича обязательна в параметрах конструктора. `+` не используется с `-`.
* `-` — фича не может быть установлена через конструктор. '-' не используется с `+`.
* `*` — не инкрементировать счётчик ссылок на значение (применить `weaken` к значению после установки его в фичу).
* `?` – создать предикат.
* `!` – создать clearer.

```perl
package ExIs { use Aion;
	has rw => (is => 'rw?!');
	has ro => (is => 'ro+');
	has wo => (is => 'wo-?');
}

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


msgid "По умолчанию — `rw`."
msgstr "By default - `rw`."

msgid "Дополнительные разрешения:"
msgstr "Additional permits:"

msgid ""
"* `+` — фича обязательна в параметрах конструктора. `+` не используется с `-`.\n"
"* `-` — фича не может быть установлена через конструктор. '-' не используется с `+`.\n"
"* `*` — не инкрементировать счётчик ссылок на значение (применить `weaken` к значению после установки его в фичу).\n"
"* `?` – создать предикат.\n"
"* `!` – создать clearer."
msgstr ""
"* `+` – the feature is required in the constructor parameters. `+` is not used with `-`.\n"
"* `-` – the feature cannot be installed via the constructor. '-' is not used with `+`.\n"
"* `*` – do not increment the value's reference counter (apply `weaken` to the value after installing it in the feature).\n"
"* `?` – create a predicate.\n"
"* `!` – create clearer."

msgid "Функция с `*` не удерживает значение:"
msgstr "The function with `*` does not hold the meaning:"

msgid "Указывает тип, а точнее – валидатор, фичи."
msgstr "Indicates the type, or rather - a validator, feature."

msgid "Может принимать:"

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

msgid "## has\n"
"Код проверки существования значения. Акцессор."
msgstr "##has\n"
"Code for checking the existence of a value. Accessor."

msgid "## clear\n"
"Код удаления значения. Акцессор."
msgstr "## clear\n"
"Code for deleting a value. Accessor."

msgid "## weaken\n"
"Код ослабления ссылки. Акцессор."
msgstr "## weaken\n"
"Link weakening code. Accessor."

msgid "## accessor_name\n"
"Имя метода-акцессора. Акцессор."
msgstr "## accessor_name\n"
"The name of the accessor method. Accessor."

msgid "## reader_name\n"
"Имя метода-ридера. Акцессор."
msgstr "## reader_name\n"
"Reader method name. Accessor."

lib/Aion.md  view on Meta::CPAN

* `ro` — создать только геттер.
* `wo` — создать только сеттер.
* `rw` — создать геттер и сеттер.

По умолчанию — `rw`.

Дополнительные разрешения:

* `+` — фича обязательна в параметрах конструктора. `+` не используется с `-`.
* `-` — фича не может быть установлена через конструктор. '-' не используется с `+`.
* `*` — не инкрементировать счётчик ссылок на значение (применить `weaken` к значению после установки его в фичу).
* `?` – создать предикат.
* `!` – создать clearer.

```perl
package ExIs { use Aion;
	has rw => (is => 'rw?!');
	has ro => (is => 'ro+');
	has wo => (is => 'wo-?');
}

lib/Aion.pm  view on Meta::CPAN

sub is_aspect {
	my ($is, $feature) = @_;
	die "Use is => '{ro|rw|wo|no} {+|-} {*} {?} {!}'" if $is !~ /^(?<access>ro|rw|wo|no)?(?<require>[+-])?(?<weak>\*)?(?<has>\??)(?<clear>!?)\z/;

	my ($construct, $name) = @$feature{qw/construct name/};

	$construct->getter("die 'Feature $name cannot be get!';") if $+{access} ~~ [qw/wo no/];

	$construct->setter("die 'Feature $name cannot be set!';") if $+{access} ~~ [qw/ro no/];

	$construct->add_trigger("%(weaken)s") if $+{weak};

	$feature->{required} = 1, $construct->not_specified(' else { die "%(init_arg)s required!" }') if $+{require} eq '+';
	
	$feature->{excessive} = 1, $construct->initer('die "%(init_arg)s excessive!"') if $+{require} eq '-';

	$feature->{make_predicate} = 1 if $+{has};
	$feature->{make_clearer} = 1 if $+{clear};
}

# isa => Type

lib/Aion.pm  view on Meta::CPAN

By default - C<rw>.

Additional permits:

=over

=item * C<+> – the feature is required in the constructor parameters. C<+> is not used with C<->.

=item * C<-> – the feature cannot be installed via the constructor. '-' is not used with C<+>.

=item * C<*> – do not increment the value's reference counter (apply C<weaken> to the value after installing it in the feature).

=item * C<?> – create a predicate.

=item * C<!> – create clearer.

=back

	package ExIs { use Aion;
		has rw => (is => 'rw?!');
		has ro => (is => 'ro+');

lib/Aion/Meta/FeatureConstruct.md  view on Meta::CPAN

$::construct->has # \> exists $self->{%(name)s}
```

## clear
Код удаления значения. Акцессор.

```perl
$::construct->clear # \> delete $self->{%(name)s}
```

## weaken
Код ослабления ссылки. Акцессор.

```perl
$::construct->weaken # \> Scalar::Util::weaken(%(get)s);
```

## accessor_name
Имя метода-акцессора. Акцессор.

```perl
$::construct->accessor_name # \> %(name)s
```

## reader_name

lib/Aion/Meta/FeatureConstruct.pm  view on Meta::CPAN


use Aion::Meta::Util qw//;

Aion::Meta::Util::create_getters(qw/
	pkg name
	write read
	getvar ret
/);
Aion::Meta::Util::create_accessors(qw/
    init_arg
	set get has clear weaken
	accessor_name reader_name writer_name predicate_name clearer_name
	initer not_specified
	getter setter selfret
/);

#  Конструктор
sub new {
	my ($cls, $pkg, $name) = @_;

	bless {

lib/Aion/Meta/FeatureConstruct.pm  view on Meta::CPAN

		getvar         => '%(get)s',
		get            => '$self->{%(name)s}',
		release        => '',
		ret            => '',
		predicate_name => 'has_%(name)s',
		has            => 'exists $self->{%(name)s}',
		clearer_name   => 'clear_%(name)s',
		clear          => 'delete $self->{%(name)s}',
		clearret       => '$self',
		cleaner        => '',
		weaken         => 'Scalar::Util::weaken(%(get)s);',
	}, ref $cls || $cls;
}

sub add_attr	{ shift->_expand('attr',	@_) }
sub add_preset  { shift->_expand('preset',  @_) }
sub add_trigger { shift->_expand('trigger', @_) }
sub add_cleaner { shift->_expand('cleaner', @_) }
sub add_access  { shift->_expand('access',  @_) }
sub add_release {
	my $self = shift;

lib/Aion/Meta/FeatureConstruct.pm  view on Meta::CPAN

Code for checking the existence of a value. Accessor.

	$::construct->has # \> exists $self->{%(name)s}

=head2 clear

Code for deleting a value. Accessor.

	$::construct->clear # \> delete $self->{%(name)s}

=head2 weaken

Link weakening code. Accessor.

	$::construct->weaken # \> Scalar::Util::weaken(%(get)s);

=head2 accessor_name

The name of the accessor method. Accessor.

	$::construct->accessor_name # \> %(name)s

=head2 reader_name

Reader method name. Accessor.

lib/Aion/Meta/Subroutine.pm  view on Meta::CPAN

	Sub::Util::set_prototype Sub::Util::prototype($referent), $sub;
	Sub::Util::set_subname Sub::Util::subname($referent), $sub;
	
	*{"$pkg\::$subname"} = $sub if $subname ne '__ANON__';
	
	$self->{wrapsub} = $sub;
	$Aion::META{$pkg}{subroutine}{$subname} = $self;

	my $key = pack 'J', Scalar::Util::refaddr $sub;
	$Aion::Isa{$key} = $self;
	Scalar::Util::weaken $Aion::Isa{$key};
	
	$self
}

sub compare {
	my ($self, $subroutine) = @_;

	die "Requires subroutine ${\$self->name}" unless $subroutine->isa('Aion::Meta::Subroutine');

	my $i = 0;

t/aion.t  view on Meta::CPAN

# * `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-?');
}

t/aion/meta/feature-construct.t  view on Meta::CPAN

local ($::_g0 = do {$::construct->has}, $::_e0 = 'exists $self->{%(name)s}'); ::ok $::_g0 eq $::_e0, '$::construct->has # \> exists $self->{%(name)s}' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;

# 
# ## clear
# Код удаления значения. Акцессор.
# 
::done_testing; }; subtest 'clear' => sub { 
local ($::_g0 = do {$::construct->clear}, $::_e0 = 'delete $self->{%(name)s}'); ::ok $::_g0 eq $::_e0, '$::construct->clear # \> delete $self->{%(name)s}' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;

# 
# ## weaken
# Код ослабления ссылки. Акцессор.
# 
::done_testing; }; subtest 'weaken' => sub { 
local ($::_g0 = do {$::construct->weaken}, $::_e0 = 'Scalar::Util::weaken(%(get)s);'); ::ok $::_g0 eq $::_e0, '$::construct->weaken # \> Scalar::Util::weaken(%(get)s);' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;

# 
# ## accessor_name
# Имя метода-акцессора. Акцессор.
# 
::done_testing; }; subtest 'accessor_name' => sub { 
local ($::_g0 = do {$::construct->accessor_name}, $::_e0 = '%(name)s'); ::ok $::_g0 eq $::_e0, '$::construct->accessor_name # \> %(name)s' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;

# 
# ## reader_name



( run in 2.657 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )