File Coverage

blib/lib/Aion/Meta/Util.pm
Criterion Covered Total %
statement 184 218 84.4
branch 94 140 67.1
condition 10 13 76.9
subroutine 56 65 86.1
pod 60 60 100.0
total 404 496 81.4


line stmt bran cond sub pod time code
1             package Aion::Meta::Util;
2              
3 11     11   130200 use common::sense;
  11         21  
  11         77  
4              
5             require overload;
6 11     11   949 use Scalar::Util qw//;
  11         20  
  11         259  
7 11     11   48 use Exporter qw/import/;
  11         30  
  11         5417  
8              
9             our @EXPORT = our @EXPORT_OK = grep {
10             my $x = $Aion::Meta::Util::{$_};
11             !ref $x
12             && *{$x}{CODE}
13             && !/^(_|(NaN|import)\z)/n
14             } keys %Aion::Meta::Util::;
15              
16             # Создаёт геттеры
17             sub create_getters(@) {
18 35     35 1 130 my $pkg = caller;
19             eval "package $pkg; sub $_ {
20             die \"$_ is ro\" if \@_ > 1;
21             shift->{$_}
22 35 0 50 0 1 4833 } 1" or die for @_;
  0 0   0 1 0  
  0 50   80 1 0  
  0 50   1 1 0  
  0 0   0 1 0  
  80 50   1 1 5446  
  80 100   4 1 375  
  1 50   13 1 3605  
  1 50   6 1 4  
  0 0   0 1 0  
  0 50   1 1 0  
  1 0   0 1 3426  
  1 50   2 1 5  
  4 50   1 1 3487  
  3 50   2 1 12  
  13 50   5 1 50  
  13 50   3 1 44  
  6 0   0 1 4600  
  6 50   43 1 16  
  0 50   1 1 0  
  0 0   0 1 0  
  1 50   1 1 8  
  1 50   9 1 14  
  0 50   3 1 0  
  0 0   0 1 0  
  2 50   1 1 4782  
  2         7  
  1         3653  
  1         5  
  2         2911  
  2         7  
  5         13  
  5         14  
  3         4482  
  3         11  
  0         0  
  0         0  
  43         197  
  43         159  
  1         4228  
  1         5  
  0         0  
  0         0  
  1         3440  
  1         7  
  9         29  
  9         73  
  3         17  
  3         31  
  0         0  
  0         0  
  1         2682  
  1         7  
23             }
24              
25             # Создаёт геттеры/сеттеры
26             sub create_accessors(@) {
27 20     20 1 143495 my $pkg = caller;
28             eval "package $pkg; sub $_ {
29             if(\@_ > 1) { \$_[0]->{$_} = \$_[1]; \$_[0] }
30             else { shift->{$_} }
31 20 100 50 2 1 3337 } 1" or die for @_;
  2 100   2 1 3557  
  1 100   2 1 4  
  1 50   1 1 5  
  1 100   2 1 4  
  2 100   2 1 4104  
  1 100   2 1 8  
  1 50   1 1 3  
  1 100   3 1 3  
  2 50   1 1 2894  
  1 100   2 1 3  
  1 100   4 1 3  
  1 100   2 1 4  
  1 100   2 1 3017  
  0 100   2 1 0  
  0 100   2 1 0  
  1 100   2 1 4  
  2 100   2 1 2839  
  1 0   0 1 2  
  1 100   17 1 4  
  1 100   2 1 4  
  2 100   2 1 4079  
  1 100   2 1 5  
  1 100   2 1 2  
  1 50   1 1 3  
  2 50   1 1 5612  
  1 100   23 1 4  
  1 100   2 1 2  
  1 50   1 1 3  
  1 100   2 1 3275  
  0 100   2   0  
  0         0  
  1         4  
  3         2864  
  2         8  
  2         5  
  1         4  
  1         3002  
  0         0  
  0         0  
  1         4  
  2         4837  
  1         2  
  1         3  
  1         6  
  4         2893  
  3         10  
  3         6  
  1         4  
  2         79  
  1         4  
  1         3  
  1         4  
  2         2777  
  1         2  
  1         3  
  1         3  
  2         2604  
  1         3  
  1         3  
  1         3  
  2         2584  
  1         4  
  1         2  
  1         3  
  2         2655  
  1         3  
  1         2  
  1         3  
  2         4423  
  1         3  
  1         2  
  1         4  
  0         0  
  0         0  
  0         0  
  0         0  
  17         2875  
  16         41  
  16         96  
  1         4  
  2         2900  
  1         3  
  1         4  
  1         4  
  2         2765  
  1         4  
  1         5  
  1         7  
  2         3295  
  1         3  
  1         2  
  1         4  
  2         5093  
  1         6  
  1         3  
  1         5  
  1         3024  
  0         0  
  0         0  
  1         4  
  1         3832  
  0         0  
  0         0  
  1         4  
  23         3113  
  22         63  
  22         42  
  1         4  
  2         3189  
  1         3  
  1         2  
  1         3  
  1         2867  
  0         0  
  0         0  
  1         4  
  2         3335  
  1         2  
  1         3  
  1         5  
  2         34  
  1         4  
  1         3  
  1         4  
32             }
33              
34             # Проверяет, имеет ли подпрограмма тело
35             sub subref_is_reachable {
36 22     22 1 5243 my ($subref) = @_;
37 22         119 require B;
38 22         106 my $cv = B::svref_2object($subref);
39 22   66     352 return !(B::class($cv->ROOT) eq 'NULL' && !${ $cv->const_sv });
40             }
41              
42             # Символьное представление значения
43             use constant {
44 11         9763 MAX_DEPTH => 2,
45             MAX_HASH_SIZE => 6,
46             MAX_ARRAY_SIZE => 6,
47             MAX_SCALAR_LENGTH => 255,
48 11     11   72 };
  11         18  
49              
50             sub val_to_str($;$);
51             sub val_to_str($;$) {
52 8883     8883 1 18731 my ($v, $depth) = @_;
53            
54 8883 100       21937 if (!defined $v) { 'undef' }
  26 100       62  
    100          
55             elsif (ref $v eq 'ARRAY') {
56 5 50       31 if($depth > MAX_DEPTH) { '[...]' }
  0         0  
57             else {
58 5         13 $depth++;
59 5 50       25 join '', '[', join(', ', map({ val_to_str($_, $depth) } (
  11 50       31  
60             @$v > MAX_ARRAY_SIZE ? @$v[0..MAX_ARRAY_SIZE] : @$v
61             )), @$v > MAX_ARRAY_SIZE ? '...' : ()), ']';
62             }
63             }
64             elsif (ref $v eq 'HASH') {
65 14 50       41 if($depth > MAX_DEPTH) { '{...}' }
  0         0  
66             else {
67 14         22 $depth++;
68             join '', '{', join(', ', map({
69 14 100       160 qq{$_ => ${\val_to_str($v->{$_}, $depth)}} } (
  86 100       104  
  86         170  
70             keys %$v > MAX_HASH_SIZE
71             ? (sort keys %$v)[0..MAX_HASH_SIZE]
72             : sort keys %$v
73             )), keys %$v > MAX_HASH_SIZE ? '...' : ()), '}';
74             }
75             }
76             else {
77 8838   100     19673 my $no_str = ref $v || Scalar::Util::looks_like_number($v);
78              
79 8838 100       13050 if(ref $v eq 'Regexp') {
80 10         18 $v = "$v";
81 10         94 $v =~ s{^\(\?\^?([a-z]*):(.*)\)$}{qr/$2/$1}si;
82             }
83             else {
84 8828 100 100     15710 $v = overload::Overloaded($v) && !overload::Method($v, '""')
85             ? join("#", Scalar::Util::reftype($v), Scalar::Util::refaddr($v))
86             : "$v";
87             }
88 8838 50       105963 $v = substr($v, 0, MAX_SCALAR_LENGTH) . '...'
89             if length($v) > MAX_SCALAR_LENGTH;
90 8838 100       22259 $no_str ? $v : "'${\ $v =~ s/['\\]/\\$&/gr }'"
  880         4047  
91             }
92             }
93              
94             1;
95              
96             __END__