File Coverage

lib/Perl/PrereqScanner/NotQuiteLite/Parser/ObjectPad.pm
Criterion Covered Total %
statement 58 58 100.0
branch 20 22 90.9
condition 27 38 71.0
subroutine 7 7 100.0
pod 0 4 0.0
total 112 129 86.8


line stmt bran cond sub pod time code
1             package Perl::PrereqScanner::NotQuiteLite::Parser::ObjectPad;
2              
3 94     94   1864 use strict;
  94         166  
  94         2999  
4 94     94   404 use warnings;
  94         167  
  94         3478  
5 94     94   429 use Perl::PrereqScanner::NotQuiteLite::Util;
  94         212  
  94         68936  
6              
7             sub register { return {
8 93     93 0 526 use => {
9             'Object::Pad' => 'parse_object_pad_args',
10             },
11             }}
12              
13             sub parse_object_pad_args {
14 80     80 0 179 my ($class, $c, $used_module, $raw_tokens) = @_;
15              
16 80         292 $c->register_sub_parser(
17             'class',
18             [$class, 'parse_class_args', $used_module],
19             );
20 80         215 $c->register_sub_parser(
21             'role',
22             [$class, 'parse_role_args', $used_module],
23             );
24              
25 80         264 $c->register_keyword_parser(
26             'class',
27             [$class, 'parse_class_args', $used_module],
28             );
29 80         215 $c->register_keyword_parser(
30             'role',
31             [$class, 'parse_role_args', $used_module],
32             );
33              
34 80         224 $c->register_sub_keywords(qw/
35             class method role
36             /);
37              
38 80         345 $c->prototype_re(qr{\G(\((?:[^\\\(\)]*(?:\\.[^\\\(\)]*)*)\))});
39             }
40              
41             sub parse_class_args {
42 76     76 0 162 my ($class, $c, $used_module, $raw_tokens) = @_;
43              
44 76         186 my $tokens = convert_string_tokens($raw_tokens);
45 76         109 shift @$tokens; # discard class
46              
47 76         120 my $isa = my $does = 0;
48 76         137 while(my $token = shift @$tokens) {
49 271         1595 my ($name, $version) = ('', 0);
50             # only for old Object::Pad: isa is a keyword now
51 271 100 33     985 if (ref $token && $token->[1] && ($token->[1] eq 'WORD' or $token->[1] eq 'KEYWORD')) {
      100        
      66        
52 170 100 66     435 if ($token->[0] eq 'isa' or $token->[0] eq 'extends') {
53 17         23 $isa = 1;
54 17         19 $does = 0;
55 17         33 next;
56             }
57 153 100 66     386 if ($token->[0] eq 'does' or $token->[0] eq 'implements') {
58 21         32 $isa = 0;
59 21         27 $does = 1;
60 21         44 next;
61             }
62 132 50       260 if (is_module_name($token->[0])) {
63 132         193 $name = $token->[0];
64 132 100 100     299 if (@$tokens && is_version($tokens->[0])) {
65 77         125 $version = shift @$tokens;
66             }
67 132 100 100     354 if ($isa or $does) {
68 56         115 $c->add($name => $version);
69             } else {
70 76         184 $c->add_package($name => $version);
71             }
72             }
73             }
74 233 100 66     3793 if (ref $token && $token->[0] eq ':') {
75 2         4 $isa = $does = 0;
76 2         10 last;
77             }
78 231 100 33     1075 if (ref $token && $token->[1] && $token->[1] eq 'ATTRIBUTE') {
      66        
79 32         208 while($token->[0] =~ s/:(?:isa|does)\(([^)]+)\)//) {
80 56         1566 my ($name, $version) = split /\s+/, $1;
81 56   100     127 $version ||= 0;
82 56 50 33     96 if (is_module_name($name) && is_version($version)) {
83 56         120 $c->add($name => $version);
84             }
85             }
86             }
87             }
88             }
89              
90             sub parse_role_args {
91 16     16 0 44 my ($class, $c, $used_module, $raw_tokens) = @_;
92              
93 16         70 my $tokens = convert_string_tokens($raw_tokens);
94 16         53 shift @$tokens; # discard role
95              
96 16         40 while(my $token = shift @$tokens) {
97 32         53 my ($name, $version) = ('', 0);
98 32 100       63 if (is_module_name($token->[0])) {
99 16         31 $name = $token->[0];
100 16 100 100     56 if (@$tokens && is_version($tokens->[0])) {
101 9         22 $version = shift @$tokens;
102             }
103 16         51 $c->add_package($name => $version);
104             }
105             }
106             }
107              
108             1;
109              
110             __END__