File Coverage

blib/lib/Aion/Pleroma.pm
Criterion Covered Total %
statement 31 32 96.8
branch 16 18 88.8
condition 9 13 69.2
subroutine 7 7 100.0
pod 3 3 100.0
total 66 73 90.4


line stmt bran cond sub pod time code
1             package Aion::Pleroma;
2             # Контейнер для эонов (сервисов)
3              
4 2     2   123070 use common::sense;
  2         3  
  2         13  
5              
6 2     2   553 use Aion::Env AION_PLEROMA_INI => (default => 'etc/annotation/eon.ann');
  2         1053  
  2         14  
7 2     2   198 use Aion::Env AION_PLEROMA_AUTOWARE => (default => 1);
  2         3  
  2         5  
8              
9 2     2   372 use Aion;
  2         3  
  2         8  
10              
11             # Файл с аннотациями
12             has ini => (is => 'ro', isa => Maybe[Str], default => AION_PLEROMA_INI);
13              
14             # Конфигурация: ключ => класс#метод_класса
15             has pleroma => (is => 'ro', isa => HashRef[Str], default => sub {
16             my ($self) = @_;
17            
18             my %pleroma = ('Aion::Pleroma' => 'Aion::Pleroma#new');
19             return \%pleroma unless defined $self->ini and -e $self->ini;
20              
21             open my $f, '<:utf8', $self->ini or die "Not open ${\$self->ini}: $!";
22             while(<$f>) {
23             close($f), die "${\$self->ini} corrupt at line $.: $_" unless /^([\w:]+)#(\w*),\d+=(.*)$/;
24             my ($pkg, $sub, $key) = ($1, $2, $3);
25             my $action = join "#", $pkg, $sub || 'new';
26              
27             $key = $key ne ""? $key: ($sub? "$pkg#$sub": $pkg);
28              
29             close($f), die "The eon $key is $pleroma{$key}, but added other $action" if exists $pleroma{$key};
30              
31             $pleroma{$key} = $action;
32             }
33             close $f;
34              
35             \%pleroma
36             });
37              
38             # Совокупность порождённых эонов-сервисов
39             has eon => (is => 'ro', isa => HashRef[Object], lazy => 0, default => sub { +{'Aion::Pleroma' => shift} });
40              
41             # Получить эон из контейнера
42             sub get {
43 16     16 1 642 my ($self, $key) = @_;
44            
45 16         34 my $eon = $self->{eon}{$key};
46 16 100       67 return $eon if $eon;
47            
48 14         302 my $config = $self->pleroma->{$key};
49 14 100 66     225 if($config) {
    50          
50 9 50       45 my ($pkg, $method) = $config =~ /#/? ($`, $'): ();
51 9 100 50     523 eval "require $pkg" or die unless $pkg->can('new') || $pkg->can('does');
      66        
52 9         57 $self->{eon}{$key} = $pkg->$method;
53             }
54 0         0 elsif(AION_PLEROMA_AUTOWARE and $key =~ /^([\w:]+)(#\w+)?$/ and eval "require $1") { $self->autoware($key)->get($key) }
55 5         679 else { undef }
56             }
57              
58             # Получить эон из контейнера или исключение, если его там нет
59             sub resolve {
60 7     7 1 2444 my ($self, $key) = @_;
61            
62 7   100     19 $self->get($key) // die "$key is'nt eon!"
63             }
64              
65             # Добавить в плерому пакет
66             sub autoware {
67 5     5 1 2340 my ($self, $action, $key) = @_;
68 5 100       25 my ($pkg, $sub) = $action =~ /#/? ($`, $'): ($action, 'new');
69 5         11 $action = "$pkg#$sub";
70 5 100 66     28 $key //= $action =~ /#new$/? $pkg: $action;
71              
72 5 100       153 if(my $action_exists = $self->pleroma->{$key}) {
73 2 100       16 die "Added eon $key twice, with $action ne $action_exists" if $action_exists ne $action;
74             }
75             else {
76 3         72 $self->pleroma->{$key} = $action;
77             }
78 4         18 $self
79             }
80              
81             1;
82              
83             __END__