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 10     10   134647 use common::sense;
  10         28  
  10         76  
4              
5             require overload;
6 10     10   677 use Scalar::Util qw//;
  10         23  
  10         212  
7 10     10   28 use Exporter qw/import/;
  10         12  
  10         4274  
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 34     34 1 94 my $pkg = caller;
19             eval "package $pkg; sub $_ {
20             die \"$_ is ro\" if \@_ > 1;
21             shift->{$_}
22 34 0 50 0 1 4032 } 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 3836  
  80 100   4 1 261  
  1 50   13 1 3368  
  1 50   5 1 18  
  0 0   0 1 0  
  0 50   2 1 0  
  1 50   2 1 2823  
  1 0   0 1 4  
  4 50   1 1 3663  
  3 50   4 1 10  
  13 50   41 1 27  
  13 0   0 1 27  
  5 50   5 1 14  
  5 50   3 1 15  
  0 50   1 1 0  
  0 0   0 1 0  
  2 50   1 1 2969  
  2 50   9 1 6  
  2 50   3 1 3028  
  2 0   0 1 6  
  0 50   1 1 0  
  0         0  
  1         3273  
  1         3  
  4         2948  
  4         16  
  41         115  
  41         88  
  0         0  
  0         0  
  5         15  
  5         15  
  3         2955  
  3         11  
  1         3438  
  1         4  
  0         0  
  0         0  
  1         3389  
  1         2  
  9         51  
  9         69  
  3         12  
  3         16  
  0         0  
  0         0  
  1         2784  
  1         4  
23             }
24              
25             # Создаёт геттеры/сеттеры
26             sub create_accessors(@) {
27 19     19 1 154180 my $pkg = caller;
28             eval "package $pkg; sub $_ {
29             if(\@_ > 1) { \$_[0]->{$_} = \$_[1]; \$_[0] }
30             else { shift->{$_} }
31 19 100 50 2 1 2780 } 1" or die for @_;
  2 100   2 1 3452  
  1 100   2 1 2  
  1 50   1 1 3  
  1 100   2 1 4  
  2 100   2 1 2766  
  1 100   2 1 3  
  1 50   1 1 3  
  1 100   3 1 3  
  2 50   1 1 2658  
  1 100   2 1 3  
  1 100   4 1 2  
  1 100   2 1 3  
  1 100   2 1 3388  
  0 100   2 1 0  
  0 100   2 1 0  
  1 100   2 1 4  
  2 100   2 1 3415  
  1 0   0 1 2  
  1 100   17 1 3  
  1 100   2 1 4  
  2 100   2 1 2746  
  1 100   2 1 5  
  1 100   2 1 2  
  1 50   1 1 3  
  2 50   1 1 2717  
  1 100   23 1 2  
  1 100   2 1 3  
  1 50   1 1 3  
  1 100   2 1 3379  
  0 100   2   0  
  0         0  
  1         4  
  3         3434  
  2         4  
  2         5  
  1         5  
  1         3396  
  0         0  
  0         0  
  1         4  
  2         3392  
  1         2  
  1         4  
  1         3  
  4         3406  
  3         7  
  3         4  
  1         4  
  2         45  
  1         3  
  1         3  
  1         3  
  2         2334  
  1         2  
  1         2  
  1         3  
  2         2600  
  1         2  
  1         2  
  1         4  
  2         2602  
  1         2  
  1         3  
  1         4  
  2         2704  
  1         3  
  1         1  
  1         4  
  2         2720  
  1         2  
  1         3  
  1         3  
  0         0  
  0         0  
  0         0  
  0         0  
  17         3473  
  16         29  
  16         42  
  1         4  
  2         3375  
  1         3  
  1         3  
  1         4  
  2         3660  
  1         2  
  1         2  
  1         4  
  2         2721  
  1         3  
  1         2  
  1         3  
  2         2688  
  1         3  
  1         3  
  1         3  
  1         3620  
  0         0  
  0         0  
  1         3  
  1         3437  
  0         0  
  0         0  
  1         4  
  23         3444  
  22         43  
  22         38  
  1         6  
  2         2693  
  1         3  
  1         2  
  1         3  
  1         3505  
  0         0  
  0         0  
  1         4  
  2         3405  
  1         2  
  1         3  
  1         5  
  2         52  
  1         7  
  1         3  
  1         4  
32             }
33              
34             # Проверяет, имеет ли подпрограмма тело
35             sub subref_is_reachable {
36 22     22 1 5335 my ($subref) = @_;
37 22         98 require B;
38 22         98 my $cv = B::svref_2object($subref);
39 22   66     319 return !(B::class($cv->ROOT) eq 'NULL' && !${ $cv->const_sv });
40             }
41              
42             # Символьное представление значения
43             use constant {
44 10         7158 MAX_DEPTH => 2,
45             MAX_HASH_SIZE => 6,
46             MAX_ARRAY_SIZE => 6,
47             MAX_SCALAR_LENGTH => 255,
48 10     10   57 };
  10         12  
49              
50             sub val_to_str($;$);
51             sub val_to_str($;$) {
52 8665     8665 1 14441 my ($v, $depth) = @_;
53            
54 8665 100       15876 if (!defined $v) { 'undef' }
  26 100       46  
    100          
55             elsif (ref $v eq 'ARRAY') {
56 5 50       20 if($depth > MAX_DEPTH) { '[...]' }
  0         0  
57             else {
58 5         8 $depth++;
59 5 50       19 join '', '[', join(', ', map({ val_to_str($_, $depth) } (
  11 50       21  
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         21 $depth++;
68             join '', '{', join(', ', map({
69 14 100       316 qq{$_ => ${\val_to_str($v->{$_}, $depth)}} } (
  86 100       104  
  86         109  
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 8620   100     15344 my $no_str = ref $v || Scalar::Util::looks_like_number($v);
78              
79 8620 100       10407 if(ref $v eq 'Regexp') {
80 10         16 $v = "$v";
81 10         66 $v =~ s{^\(\?\^?([a-z]*):(.*)\)$}{qr/$2/$1}si;
82             }
83             else {
84 8610 100 100     11034 $v = overload::Overloaded($v) && !overload::Method($v, '""')
85             ? join("#", Scalar::Util::reftype($v), Scalar::Util::refaddr($v))
86             : "$v";
87             }
88 8620 50       76010 $v = substr($v, 0, MAX_SCALAR_LENGTH) . '...'
89             if length($v) > MAX_SCALAR_LENGTH;
90 8620 100       16508 $no_str ? $v : "'${\ $v =~ s/['\\]/\\$&/gr }'"
  830         2894  
91             }
92             }
93              
94             1;
95              
96             __END__