File Coverage

blib/lib/Aion/Meta/Feature.pm
Criterion Covered Total %
statement 287 436 65.8
branch 72 130 55.3
condition 5 11 45.4
subroutine 57 68 83.8
pod 9 18 50.0
total 430 663 64.8


line stmt bran cond sub pod time code
1             package Aion::Meta::Feature;
2              
3 5     5   134628 use common::sense;
  5         11  
  5         29  
4              
5 5     5   642 use Aion::Meta::Util qw//;
  5         24  
  5         121  
6 5     5   2328 use Aion::Meta::FeatureConstruct;
  5         18  
  5         235  
7 5     5   34 use List::Util qw/pairmap/;
  5         9  
  5         5686  
8              
9             Aion::Meta::Util::create_getters(qw/pkg name opt has construct order/);
10             Aion::Meta::Util::create_accessors(qw/
11             required excessive isa
12             lazy builder default trigger release cleaner
13             make_reader make_writer make_predicate make_clearer
14             /);
15              
16             # Конструктор
17             sub new {
18 51     51 1 181122 my ($cls, $pkg, $name, @has) = @_;
19              
20 51         108 my $meta = $Aion::META{$pkg};
21              
22             bless {
23             pkg => $pkg,
24             name => $name,
25             opt => {@has},
26             has => \@has,
27             construct => Aion::Meta::FeatureConstruct->new($pkg, $name),
28 51   33     431 order => scalar keys %{$meta->{feature}},
  51         730  
29             stash => {},
30             }, ref $cls || $cls;
31             }
32              
33             # Строковое представление фичи
34             sub stringify {
35 2     2 1 4124 my ($self) = @_;
36 2     2   2 my $has = join ', ', pairmap { "$a => ${\
37 2         10 Aion::Meta::Util::val_to_str($b)
38 2         6 }" } @{$self->{has}};
  2         19  
39 2         14 return "has $self->{name} => ($has) of $self->{pkg}";
40             }
41              
42             # Создаёт свойство
43             sub mk_property {
44 49     49 1 2973 my ($self) = @_;
45              
46 49         1700 my $meta = $Aion::META{$self->pkg};
47              
48 49         130 my $ASPECT = $meta->{aspect};
49 49         99 my $has = $self->{has};
50 49         156 for(my $i=0; $i<@$has; $i+=2) {
51 98         271 my ($aspect, $value) = @$has[$i, $i+1];
52 98         251 my $aspect_sub = $ASPECT->{$aspect};
53 98 50       202 die "has: not exists aspect `$aspect`!" if !$aspect_sub;
54 98         326 $aspect_sub->($value, $self, $aspect);
55             }
56            
57 49         1110 my $accessor = $self->construct->accessor;
58 49 100   2 0 14869 eval $accessor;
  2 50   1 0 6  
  1 50   1 1 2  
  1 50   1 1 6  
  1 50   1 0 2  
  1 50   2 0 2  
  1 50   21 0 3  
  1 50   0 1 31  
  0 50   0 0 0  
  0 0   0 0 0  
  0 0   2 0 0  
  1 0   3 0 2  
  1 50   1   3  
  1 100   7   4  
  1 50   23   3  
  1 100   1   19  
  0 100   1   0  
  0 50   2   0  
  0 50   1   0  
  0 50   2   0  
  1 50   2   1  
  1 100   1   6  
  1 50   0   4  
  1 100   2   12  
  1 50   2   3  
  1 50   1   2  
  1 0   2   5  
  1 100   1   12  
  1 50   1   30  
  0 50   1   0  
  0 50   3   0  
  0 50   2   0  
  1 50   1   2  
  1 50   1   3  
  1 50   2   5  
  1 50   1   101  
  1 50   4   4  
  0 100   0   0  
  0 50   0   0  
  0 50   0   0  
  1 50   1   2  
  1 50   4   5  
  1 50       3  
  1 100       3  
  1 0       3  
  2 0       35  
  0 0       0  
  0 50       0  
  0 50       0  
  2         3  
  2         4  
  2         10  
  2         5  
  21         45  
  0         0  
  0         0  
  0         0  
  21         26  
  21         29  
  21         66  
  21         576  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  2         31  
  0         0  
  0         0  
  0         0  
  2         2  
  2         9  
  3         1899  
  1         5  
  1         6  
  1         2  
  1         2  
  2         8  
  2         6  
  2         12  
  2         9  
  1         14  
  0         0  
  0         0  
  0         0  
  1         2  
  1         2  
  1         3  
  1         7  
  7         1559  
  1         5  
  1         8  
  1         4  
  1         3  
  1         4  
  6         15  
  6         12  
  6         33  
  6         24  
  23         62  
  0         0  
  0         0  
  0         0  
  23         28  
  23         43  
  7         23  
  7         37  
  7         19  
  23         31  
  23         113  
  23         62  
  1         4  
  0         0  
  0         0  
  0         0  
  0         0  
  1         2  
  1         5  
  1         4  
  1         6  
  1         2  
  1         3  
  1         4  
  1         13  
  1         7  
  0         0  
  0         0  
  0         0  
  1         4  
  1         5  
  2         9  
  1         4  
  1         4  
  1         4  
  1         3  
  1         4  
  1         32  
  0         0  
  0         0  
  0         0  
  1         4  
  1         4  
  1         6  
  1         6  
  2         38  
  1         3  
  1         3  
  1         50  
  1         5  
  1         14  
  2         8  
  0         0  
  0         0  
  0         0  
  0         0  
  2         5  
  2         8  
  2         9  
  1         4  
  1         4  
  0         0  
  0         0  
  0         0  
  1         3  
  1         4  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  2         1399  
  0         0  
  0         0  
  0         0  
  2         5  
  2         8  
  1         4  
  1         17  
  2         4  
  2         5  
  0         0  
  0         0  
  0         0  
  2         3  
  2         5  
  1         572  
  0         0  
  0         0  
  0         0  
  1         2  
  1         4  
  1         3  
  1         2  
  1         3  
  2         58  
  0         0  
  0         0  
  0         0  
  2         8  
  2         40  
  1         19  
  0         0  
  0         0  
  0         0  
  1         2  
  1         1  
  1         4  
  1         15  
  1         562  
  1         2  
  1         2  
  1         14  
  0         0  
  0         0  
  1         714  
  1         3  
  1         3  
  1         4  
  0         0  
  0         0  
  3         624  
  1         3  
  1         4  
  1         2  
  1         5  
  1         2  
  2         4  
  2         41  
  2         7  
  0         0  
  0         0  
  0         0  
  2         2  
  2         3  
  2         6  
  2         6  
  1         7  
  0         0  
  0         0  
  0         0  
  0         0  
  1         5  
  1         3  
  1         9  
  1         5  
  1         3  
  0         0  
  0         0  
  0         0  
  1         2  
  1         3  
  2         67  
  0         0  
  0         0  
  0         0  
  2         5  
  2         5  
  2         16  
  1         5  
  1         574  
  0         0  
  0         0  
  0         0  
  1         2  
  1         3  
  4         33  
  2         4  
  2         3  
  2         22  
  2         4  
  2         4  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1         6  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1         2  
  1         3  
  1         8  
  1         6  
  4         13  
  0         0  
  0         0  
  0         0  
  2         3  
  2         6  
  1         1  
  1         5  
  1         4  
59 49 50       347 die if $@;
60              
61 49 100       157 if($self->{make_reader}) {
62 2         30 my $reader = $self->construct->reader;
63 2     1   234 eval $reader;
  1     5   2  
  1         3  
  6         12  
  2         2  
64 2 50       12 die if $@;
65             }
66            
67 49 100       173 if($self->{make_writer}) {
68 2         31 my $writer = $self->construct->writer;
69 2     1   242 eval $writer;
  1     0   3  
  1         5  
  1         14  
  2         8  
  2         8  
  5         9  
70 2 50       14 die if $@;
71             }
72            
73 49 100       137 if($self->{make_predicate}) {
74 7         160 my $predicate = $self->construct->predicate;
75 7     2   1167 eval $predicate;
  2     3   19  
  2     1   9  
  3     1   11  
  3     1   13  
  1     4   4  
  1     0   4  
  1         41  
  1         8  
  1         15  
  1         4  
  4         154  
  4         24  
  4         12  
  0         0  
76 7 50       61 die if $@;
77             }
78            
79 49 100       224 if($self->{make_clearer}) {
80 4         118 my $clearer = $self->construct->clearer;
81 4 50   1   941 eval $clearer;
  1 50   1   5  
  1 100   2   5  
  1 50   0   3  
  1         58  
  1         739  
  1         5  
  1         7  
  1         3  
  1         3  
  2         1632  
  2         10  
  1         3  
  2         8  
  0         0  
  0         0  
  0         0  
  1         2  
82 4 50       45 die if $@;
83             }
84             }
85              
86             # Представление себя в коде
87             sub meta {
88 77     77 1 3042 my ($self) = @_;
89 77   66     561 $self->{meta} //= do {
90 36         95 my ($cls, $name) = @$self{qw/pkg name/};
91 36         364 "\$Aion::META{'$cls'}{feature}{$name}"
92             };
93             }
94              
95             # Доступ к сташу со свойствами
96             sub stash {
97 2     2 1 3208 my ($self, $key, $val) = @_;
98              
99 2   100     8 my $stash = $self->{stash}{scalar caller} //= {};
100            
101 2 100       7 @_ > 2? do { $stash->{$key} = $val; $self }: $stash->{$key};
  1         2  
  1         2  
102             }
103              
104             # Сравнивает старую фичу с перезагружаемой
105             sub compare {
106 0     0 1 0 my ($self, $other) = @_;
107            
108 0 0 0     0 die "Types mismatch: $other->{isa} <=> $self->{isa}" if $self->{isa} && $self->{isa} ne $other->{isa};
109             }
110              
111             1;
112              
113             __END__