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   155898 use common::sense;
  5         7  
  5         25  
4              
5 5     5   643 use Aion::Meta::Util qw//;
  5         9  
  5         116  
6 5     5   1751 use Aion::Meta::FeatureConstruct;
  5         11  
  5         162  
7 5     5   25 use List::Util qw/pairmap/;
  5         8  
  5         4600  
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 156870 my ($cls, $pkg, $name, @has) = @_;
19              
20 51         186 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     267 order => scalar keys %{$meta->{feature}},
  51         458  
29             stash => {},
30             }, ref $cls || $cls;
31             }
32              
33             # Строковое представление фичи
34             sub stringify {
35 2     2 1 2954 my ($self) = @_;
36 2     2   3 my $has = join ', ', pairmap { "$a => ${\
37 2         9 Aion::Meta::Util::val_to_str($b)
38 2         9 }" } @{$self->{has}};
  2         18  
39 2         15 return "has $self->{name} => ($has) of $self->{pkg}";
40             }
41              
42             # Создаёт свойство
43             sub mk_property {
44 49     49 1 2613 my ($self) = @_;
45              
46 49         1095 my $meta = $Aion::META{$self->pkg};
47              
48 49         68 my $ASPECT = $meta->{aspect};
49 49         62 my $has = $self->{has};
50 49         104 for(my $i=0; $i<@$has; $i+=2) {
51 98         227 my ($aspect, $value) = @$has[$i, $i+1];
52 98         181 my $aspect_sub = $ASPECT->{$aspect};
53 98 50       146 die "has: not exists aspect `$aspect`!" if !$aspect_sub;
54 98         187 $aspect_sub->($value, $self, $aspect);
55             }
56            
57 49         735 my $accessor = $self->construct->accessor;
58 49 100   2 0 11595 eval $accessor;
  2 50   1 0 4  
  1 50   1 1 3  
  1 50   1 1 4  
  1 50   1 0 4  
  1 50   2 0 2  
  1 50   21 0 3  
  1 50   0 1 44  
  0 50   0 0 0  
  0 0   0 0 0  
  0 0   2 0 0  
  1 0   3 0 2  
  1 50   1   2  
  1 100   7   5  
  1 50   23   4  
  1 100   1   18  
  0 100   1   0  
  0 50   2   0  
  0 50   1   0  
  0 50   2   0  
  1 50   2   3  
  1 100   2   4  
  1 50   0   4  
  1 100   2   7  
  1 50   2   3  
  1 50   1   2  
  1 0   2   4  
  1 50   1   13  
  1 50   1   14  
  0 50   1   0  
  0 50   1   0  
  0 50   1   0  
  1 50   3   1  
  1 50   1   2  
  1 50   2   3  
  1 50   1   128  
  1 50   0   4  
  0 50   4   0  
  0 100   0   0  
  0 50   1   0  
  1 100   0   1  
  1 50   3   5  
  1 50       3  
  1 0       2  
  1 100       3  
  2 0       50  
  0 50       0  
  0 0       0  
  0 50       0  
  2         5  
  2         5  
  2         10  
  2         7  
  21         66  
  0         0  
  0         0  
  0         0  
  21         37  
  21         50  
  21         76  
  21         627  
  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         38  
  0         0  
  0         0  
  0         0  
  2         17  
  2         10  
  3         911  
  1         5  
  1         8  
  1         3  
  1         3  
  2         3  
  2         4  
  2         8  
  2         5  
  1         14  
  0         0  
  0         0  
  0         0  
  1         1  
  1         2  
  1         3  
  1         2  
  7         1153  
  1         3  
  1         9  
  1         2  
  1         3  
  1         3  
  6         11  
  6         10  
  6         25  
  6         18  
  23         62  
  0         0  
  0         0  
  0         0  
  23         41  
  23         53  
  7         26  
  7         39  
  7         17  
  23         37  
  23         94  
  23         79  
  1         4  
  0         0  
  0         0  
  0         0  
  0         0  
  1         1  
  1         4  
  1         17  
  1         7  
  1         3  
  1         2  
  1         3  
  1         12  
  1         6  
  0         0  
  0         0  
  0         0  
  1         2  
  1         5  
  2         7  
  1         3  
  1         3  
  1         4  
  1         3  
  1         5  
  1         28  
  0         0  
  0         0  
  0         0  
  1         3  
  1         1  
  1         4  
  1         3  
  2         9  
  1         3  
  1         4  
  1         26  
  1         3  
  1         10  
  2         6  
  0         0  
  0         0  
  0         0  
  2         3  
  2         6  
  2         33  
  0         0  
  0         0  
  0         0  
  2         2  
  2         3  
  2         7  
  1         2  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  2         8  
  0         0  
  0         0  
  0         0  
  0         0  
  2         4  
  2         9  
  2         14  
  1         4  
  2         37  
  0         0  
  0         0  
  0         0  
  2         2  
  2         21  
  1         467  
  1         2  
  1         2  
  1         14  
  0         0  
  0         0  
  2         4  
  0         0  
  0         0  
  0         0  
  2         3  
  2         3  
  2         6  
  2         5  
  1         479  
  1         5  
  1         3  
  1         4  
  0         0  
  0         0  
  1         4  
  0         0  
  0         0  
  0         0  
  1         2  
  1         4  
  1         452  
  0         0  
  0         0  
  0         0  
  1         2  
  1         3  
  1         474  
  0         0  
  0         0  
  0         0  
  1         3  
  1         3  
  1         3  
  1         2  
  1         3  
  1         4  
  0         0  
  0         0  
  0         0  
  1         2  
  1         3  
  3         503  
  1         3  
  1         3  
  1         1  
  1         5  
  1         2  
  2         4  
  2         26  
  1         18  
  0         0  
  0         0  
  0         0  
  1         1  
  1         3  
  1         5  
  1         15  
  2         1366  
  0         0  
  0         0  
  0         0  
  2         6  
  2         40  
  1         7  
  1         33  
  2         10  
  1         4  
  0         0  
  0         0  
  0         0  
  0         0  
  1         2  
  1         2  
  1         3  
  1         3  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  4         30  
  2         3  
  2         3  
  2         50  
  2         4  
  2         4  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1         4  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  1         2  
  1         2  
  1         4  
  1         2  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  3         11  
  0         0  
  0         0  
  0         0  
  2         3  
  2         8  
  2         3  
  2         7  
  2         7  
59 49 50       317 die if $@;
60              
61 49 100       118 if($self->{make_reader}) {
62 2         32 my $reader = $self->construct->reader;
63 2     1   258 eval $reader;
  1     6   2  
  1         4  
  5         16  
  1         2  
64 2 50       14 die if $@;
65             }
66            
67 49 100       103 if($self->{make_writer}) {
68 2         32 my $writer = $self->construct->writer;
69 2     1   224 eval $writer;
  1     0   2  
  1         6  
  1         12  
  1         4  
  1         2  
  6         13  
70 2 50       12 die if $@;
71             }
72            
73 49 100       87 if($self->{make_predicate}) {
74 7         104 my $predicate = $self->construct->predicate;
75 7     2   751 eval $predicate;
  2     3   18  
  2     1   7  
  3     1   11  
  3     4   11  
  1     1   3  
  1     0   4  
  1         15  
  1         3  
  4         92  
  4         15  
  1         16  
  1         6  
  4         17  
  0         0  
76 7 50       41 die if $@;
77             }
78            
79 49 100       149 if($self->{make_clearer}) {
80 4         61 my $clearer = $self->construct->clearer;
81 4 50   1   566 eval $clearer;
  1 50   1   4  
  1 100   2   5  
  1 50   0   4  
  1         26  
  1         513  
  1         25  
  1         6  
  1         3  
  1         2  
  2         984  
  2         8  
  1         3  
  2         5  
  0         0  
  0         0  
  0         0  
  2         3  
82 4 50       27 die if $@;
83             }
84             }
85              
86             # Представление себя в коде
87             sub meta {
88 77     77 1 2765 my ($self) = @_;
89 77   66     354 $self->{meta} //= do {
90 36         85 my ($cls, $name) = @$self{qw/pkg name/};
91 36         258 "\$Aion::META{'$cls'}{feature}{$name}"
92             };
93             }
94              
95             # Доступ к сташу со свойствами
96             sub stash {
97 2     2 1 2555 my ($self, $key, $val) = @_;
98              
99 2   100     9 my $stash = $self->{stash}{scalar caller} //= {};
100            
101 2 100       6 @_ > 2? do { $stash->{$key} = $val; $self }: $stash->{$key};
  1         2  
  1         3  
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__