Aion
view release on metacpan or search on metacpan
lib/Aion.pm view on Meta::CPAN
for my $key (keys %$REQUIRE) {
my $require = $REQUIRE->{$key};
if ($require->isa('Aion::Meta::RequiresAnyFunction')) {
$require->compare($cls->can($key));
} elsif ($require->isa('Aion::Meta::RequiresFeature')) {
$require->compare($FEATURE->{$require->name});
} else {
$require->compare($SUBROUTINE->{$require->subname});
}
}
%$REQUIRE = ();
# TODO: оÑиÑаÑÑ ÐºÐ»Ð°ÑÑ Ð¾Ñ Ð²ÑпомогаÑелÑнÑÑ
ÑÑнкÑий
#eval "package $cls; Aion->unimport; 1" or die;
my $new = << 'END';
package %(cls)s {
sub new {
my ($cls, %value) = @_;
$cls = ref $cls || $cls;
my $self = bless {}, $cls;
%(initializers)s
if(scalar keys %value) {
my @fakekeys = sort keys %value;
die "@fakekeys is'nt feature!" if @fakekeys == 1;
local $" = ", ";
die "@fakekeys is'nt features!"
}
return $self;
}
}
END
my @destroyers;
my $initializers = join "", map {
push @destroyers, $_->{construct}->destroyer if $_->{cleaner};
$_->{construct}->initializer
} sort { $a->{order} <=> $b->{order} } values %$FEATURE;
my %var = (
cls => $cls,
initializers => $initializers,
);
$new =~ s/%\((\w+)\)s/$var{$1}/ge;
eval $new;
die if $@;
if (@destroyers) {
my $destroyer = << 'END';
package %(cls)s {
sub DESTROY {
my ($self) = @_;
warn "${\ref $self}#${\Scalar::Util::id $self} destroy in global phase!" if ${^GLOBAL_PHASE} eq 'DESTRUCT';
%(destroyers)s
}
}
END
my %var = (
cls => $cls,
destroyers => join "", @destroyers,
);
$destroyer =~ s/%\((\w+)\)s/$var{$1}/ge;
eval $destroyer;
die $@ if $@;
}
goto &{"${cls}::new"};
}
1;
__END__
=encoding utf-8
=head1 NAME
Aion - a postmodern object system for Perl 5, such as âMouseâ, âMooseâ, âMooâ, âMoâ and âMâ, but with improvements
=head1 VERSION
1.9
=head1 SYNOPSIS
package Calc {
use Aion;
has a => (is => 'ro+', isa => Num);
has b => (is => 'ro+', isa => Num);
has op => (is => 'ro', isa => Enum[qw/+ - * \/ **/], default => '+');
sub result : Isa(Me => Num) {
my ($self) = @_;
eval "${\ $self->a} ${\ $self->op} ${\ $self->b}";
}
}
Calc->new(a => 1.1, b => 2)->result # => 3.1
=head1 DESCRIPTION
Aion is OOP-framework for creating classes with B<features>, has B<aspects>, B<roles> and so on.
The properties declared through HAS are called B<features>.
And C<is>,C<isa>, C<default>, and so on inC<has> are called B<aspects>.
( run in 0.749 second using v1.01-cache-2.11-cpan-ceb78f64989 )