File Coverage

lib/Perl/PrereqScanner/NotQuiteLite/Parser/ClassLoad.pm
Criterion Covered Total %
statement 61 64 95.3
branch 20 26 76.9
condition 13 29 44.8
subroutine 9 10 90.0
pod 0 7 0.0
total 103 136 75.7


line stmt bran cond sub pod time code
1             package Perl::PrereqScanner::NotQuiteLite::Parser::ClassLoad;
2              
3 94     94   1810 use strict;
  94         166  
  94         2818  
4 94     94   368 use warnings;
  94         197  
  94         3540  
5 94     94   434 use Perl::PrereqScanner::NotQuiteLite::Util;
  94         185  
  94         76335  
6              
7             my %known_functions = map {$_ => 1} qw/
8             load_class try_load_class load_optional_class
9             load_first_existing_class
10             /;
11              
12             sub register { return {
13 93     93 0 469 use => {
14             'Class::Load' => 'parse_class_load_args',
15             },
16             }}
17              
18             sub register_fqfn { return {
19 774     774 0 2086 map { "Class::Load::".$_ => "parse_".$_."_args" }
  3096         9472  
20             keys %known_functions
21             }}
22              
23             sub parse_class_load_args {
24 11     11 0 21 my ($class, $c, $used_module, $raw_tokens) = @_;
25              
26 11         25 my $tokens = convert_string_tokens($raw_tokens);
27 11 50       20 if (is_version($tokens->[0])) {
28 0         0 $c->add($used_module => shift @$tokens);
29             }
30              
31 11         26 for my $token (@$tokens) {
32 21 100       59 next if ref $token;
33              
34 10 100       25 if ($known_functions{$token}) {
    50          
35 7         27 $c->register_keyword_parser(
36             $token,
37             [$class, 'parse_'.$token.'_args', $used_module],
38             );
39             } elsif ($token eq ':all') {
40 3         9 for my $func (keys %known_functions) {
41 12         29 $c->register_keyword_parser(
42             $func,
43             [$class, 'parse_'.$func.'_args', $used_module],
44             );
45             }
46             }
47             }
48             }
49              
50             sub parse_load_class_args {
51 6     6 0 12 my ($class, $c, $used_module, $raw_tokens) = @_;
52              
53 6         14 my $tokens = convert_string_tokens($raw_tokens);
54 6         7 shift @$tokens; # function
55 6         14 my ($module, undef, $options) = @$tokens;
56 6         9 my $version = 0;
57 6 100 66     15 if (ref $options and $options->[1] eq '{}') {
58 1         3 my $tokens_in_hashref = convert_string_tokens($options->[0]);
59 1         5 while(my ($key, undef, $value, undef) = splice @$tokens_in_hashref, 0, 4) {
60 1 50 33     5 if (ref $key and $key->[0] eq '-version' and is_version($value)) {
      33        
61 1         5 $version = $value;
62             }
63             }
64             }
65 6         26 $c->add_conditional($module => $version);
66             }
67              
68             sub parse_try_load_class_args {
69 3     3 0 8 my ($class, $c, $used_module, $raw_tokens) = @_;
70              
71 3         8 my $tokens = convert_string_tokens($raw_tokens);
72 3         5 shift @$tokens; # function
73 3         6 my ($module, undef, $options) = @$tokens;
74 3         5 my $version = 0;
75 3 100 66     11 if (ref $options and $options->[1] eq '{}') {
76 1         2 my $tokens_in_hashref = convert_string_tokens($options->[0]);
77 1         5 while(my ($key, undef, $value, undef) = splice @$tokens_in_hashref, 0, 4) {
78 1 50 33     6 if (ref $key and $key->[0] eq '-version' and is_version($value)) {
      33        
79 1         4 $version = $value;
80             }
81             }
82             }
83 3         9 $c->add_suggestion($module => $version);
84             }
85              
86             sub parse_load_optional_class_args {
87 0     0 0 0 my ($class, $c, $used_module, $raw_tokens) = @_;
88              
89 0         0 $class->parse_try_load_class_args($c, $used_module, $raw_tokens);
90             }
91              
92             sub parse_load_first_existing_class_args {
93 2     2 0 4 my ($class, $c, $used_module, $raw_tokens) = @_;
94              
95 2         5 my $tokens = convert_string_tokens($raw_tokens);
96 2         2 shift @$tokens; # function
97 2         4 my ($module, $version);
98 2         5 for my $token (@$tokens) {
99 14 100       20 if (is_module_name($token)) {
100 5 100       11 if ($module) {
101 3         7 $c->add_suggestion($module => $version);
102             }
103 5         147 $module = $token;
104 5         23 $version = 0;
105 5         10 next;
106             }
107 9 100 50     31 if (ref $token and ($token->[1] || '') eq '{}') {
      66        
108 2         18 my $tokens_in_hashref = convert_string_tokens($token->[0]);
109 2         7 while(my ($key, undef, $value, undef) = splice @$tokens_in_hashref, 0, 4) {
110 2 50 33     9 if (ref $key and $key->[0] eq '-version' and is_version($value)) {
      33        
111 2         7 $version = $value;
112             }
113             }
114             }
115             }
116 2 50       5 if ($module) {
117 2         5 $c->add_suggestion($module => $version);
118             }
119             }
120              
121             1;
122              
123             __END__