Aion
view release on metacpan or search on metacpan
lib/Aion/Pleroma.pm view on Meta::CPAN
package Aion::Pleroma;
# ÐонÑÐµÐ¹Ð½ÐµÑ Ð´Ð»Ñ Ñонов (ÑеÑвиÑов)
use common::sense;
use Aion::Env AION_PLEROMA_INI => (default => 'etc/annotation/eon.ann');
use Aion::Env AION_PLEROMA_AUTOWARE => (default => 1);
use Aion::Env::Etc EON => (default => {}, key => 'aion.eon');
use Aion;
# Файл Ñ Ð°Ð½Ð½Ð¾ÑаÑиÑми
has ini => (is => 'ro', isa => Maybe[Str], default => AION_PLEROMA_INI);
# ÐонÑигÑÑаÑиÑ: клÑÑ => 'клаÑÑ#меÑод_клаÑÑа' | Ñ
еÑ-опиÑание Ñона
has pleroma => (is => 'ro?!', isa => HashRef, default => sub {
my ($self) = @_;
my %pleroma = ('Aion::Pleroma' => 'Aion::Pleroma#new', %{&EON});
return \%pleroma unless defined $self->ini and -e $self->ini;
open my $f, '<:utf8', $self->ini or die "Not open ${\$self->ini}: $!";
while(<$f>) {
close($f), die "${\$self->ini} corrupt at line $.: $_" unless /^([\w:]+)#(\w*),\d+=(.*)$/;
my ($pkg, $sub, $key) = ($1, $2, $3);
my $action = join "#", $pkg, $sub || 'new';
$key = $key ne ""? $key: ($sub? "$pkg#$sub": $pkg);
close($f), die "The eon $key is $pleroma{$key}, but added other $action" if exists $pleroma{$key};
$pleroma{$key} = $action;
}
close $f;
\%pleroma
});
# СовокÑпноÑÑÑ Ð¿Ð¾ÑождÑннÑÑ
Ñонов-ÑеÑвиÑов
has eon => (is => 'ro', isa => HashRef[Object], lazy => 0, default => sub { +{'Aion::Pleroma' => shift} });
# ÐолÑÑиÑÑ Ñон из конÑейнеÑа
sub get {
my ($self, $key) = @_;
my $eon = $self->{eon}{$key};
return $eon if $eon;
my $config = $self->pleroma->{$key};
if(ref $config eq 'HASH') {
$self->{eon}{$key} = $self->build($key, $config);
}
elsif($config) {
$self->{eon}{$key} = $self->construct($config, []);
}
elsif(AION_PLEROMA_AUTOWARE and $key =~ /^([\w:]+)(#\w+)?$/ and eval "require $1") { $self->autoware($key)->get($key) }
else { undef }
}
# ÐоÑÑÑоиÑÑ Ñон из Ñ
еÑ-опиÑаниÑ: class, method, arguments, calls
sub build {
my ($self, $key, $conf) = @_;
my $pkg = $conf->{class} // ($key =~ /^[\w:]+$/ ? $key : undef)
or die "Eon $key: class is undef! Optional 'class' key or key-as-class.";
my $method = $conf->{method} // 'new';
$self->_require($pkg);
my $args = $conf->{arguments} // {};
$args = $self->resolve_args($args);
my $eon = $self->construct("$pkg#$method", $args);
for my $call (@{ $conf->{calls} // [] }) {
my ($name, @call_args);
if(ref $call eq 'ARRAY') { ($name, @call_args) = @$call }
else { $name = $call }
@call_args = map { $self->resolve_value($_) } @call_args;
$eon->$name(@call_args);
}
( run in 0.238 second using v1.01-cache-2.11-cpan-ff9377addf4 )