File Coverage

lib/Perl/PrereqScanner/NotQuiteLite/Parser/Moose.pm
Criterion Covered Total %
statement 68 79 86.0
branch 16 24 66.6
condition 5 8 62.5
subroutine 11 13 84.6
pod 0 9 0.0
total 100 133 75.1


line stmt bran cond sub pod time code
1             package Perl::PrereqScanner::NotQuiteLite::Parser::Moose;
2              
3 96     96   1563 use strict;
  96         181  
  96         2789  
4 96     96   325 use warnings;
  96         145  
  96         3598  
5 96     96   389 use Perl::PrereqScanner::NotQuiteLite::Util;
  96         136  
  96         83251  
6              
7             # There are so many Moose-like variants
8              
9             # Like Moose; modules that are not listed here but have Moose
10             # in their name are implicitly treated like these as well
11             my @ExportsExtendsAndWith = qw/
12             Moose Moo Mouse MooX Moo::Lax Moos
13             MooseX::App MooseX::Singleton MooseX::SingletonMethod
14              
15             HTML::FormHandler::Moose Test::Class::Moose
16              
17             App::GHPT::Wrapper::OurMoose App::wmiirc::Plugin Ark
18             Bot::Backbone::Service Bubblegum::Class CatalystX::Declare
19             Cogwheel CPAN::Testers::Backend::Base Dancer2::Plugin
20             Data::Object::Class DBICx::Modeler::Model Digital::Driver
21             Elastic::Doc Fey::ORM::Table Form::Factory::Processor
22             Jedi::App Momo Moonshine::Magic Moxie Nile::Base
23             Parse::FixedRecord Pcore Reaction::Class Reaction::UI::WidgetClass
24             Squirrel Statocles::Base TAEB::OO Test::Able Test::Roo
25             Web::Simple XML::Rabbit
26             /;
27              
28             # Like Moose::Role; modules that are not listed here but have Role
29             # in their name are implicitly treated like these as well
30              
31             my @ExportsWith = qw/
32             Moose::Role Moo::Role Mouse::Role
33             MooseX::Role::Parameterized
34             Mason::PluginRole Mojo::RoleTiny MooX::Cmd
35             Role::Basic Role::Tiny Role::Tiny::With Reflex::Role
36             Template::Caribou Test::Routine App::SimulateReads::Base
37             /;
38              
39             # Like Mo
40             my @ExportsExtends = qw/
41             Mo
42             Lingy::Base OptArgs2::Mo Parse::SAMGov::Mo Pegex::Base
43             Sub::Mage TestML::Base Type::Utils VSO
44             /;
45              
46             sub register {
47 95     95 0 371 my ($class, %args) = @_;
48              
49             # Make sure everything is unique
50 95 50       201 my %exports_extends_and_with = map {$_ => 1} (@ExportsExtendsAndWith, @{$args{exports_extends_and_with} || []});
  3990         6738  
  95         630  
51 95 50       347 my %exports_extends = map {$_ => 1} (@ExportsExtends, @{$args{exports_extends} || []});
  855         1487  
  95         489  
52 95 50       221 my %exports_with = map {$_ => 1} (@ExportsWith, @{$args{exports_with} || []});
  1330         2222  
  95         386  
53              
54 95         423 for my $module (keys %exports_with) {
55 1330 50       1970 if (exists $exports_extends_and_with{$module}) {
56 0         0 delete $exports_with{$module};
57 0         0 next;
58             }
59 1330 50       2092 if (exists $exports_extends{$module}) {
60 0         0 $exports_extends_and_with{$module} = 1;
61 0         0 delete $exports_with{$module};
62 0         0 next;
63             }
64             }
65 95         301 for my $module (keys %exports_extends) {
66 855 50       1382 if (exists $exports_extends_and_with{$module}) {
67 0         0 delete $exports_extends{$module};
68 0         0 next;
69             }
70             }
71              
72 95         193 my %mapping;
73 95         245 for my $module (keys %exports_with) {
74 1330         2070 $mapping{use}{$module} = 'register_with';
75 1330         2109 $mapping{no}{$module} = 'remove_with';
76             }
77 95         271 for my $module (keys %exports_extends) {
78 855         1250 $mapping{use}{$module} = 'register_extends';
79 855         1445 $mapping{no}{$module} = 'remove_extends';
80             }
81 95         661 for my $module (keys %exports_extends_and_with) {
82 3990         5852 $mapping{use}{$module} = 'register_extends_and_with';
83 3990         6165 $mapping{no}{$module} = 'remove_extends_and_with';
84             }
85              
86 95         931 return \%mapping;
87             }
88              
89             sub register_extends_and_with {
90 56     56 0 127 my ($class, $c, $used_module, $raw_tokens) = @_;
91              
92 56         200 $c->register_keyword_parser(
93             'extends',
94             [$class, 'parse_extends_args', $used_module],
95             );
96 56         167 $c->register_keyword_parser(
97             'with',
98             [$class, 'parse_with_args', $used_module],
99             );
100             }
101              
102             sub register_with {
103 3     3 0 8 my ($class, $c, $used_module, $raw_tokens) = @_;
104              
105 3         14 $c->register_keyword_parser(
106             'with',
107             [$class, 'parse_with_args', $used_module],
108             );
109             }
110              
111             sub register_extends {
112 2     2 0 5 my ($class, $c, $used_module, $raw_tokens) = @_;
113              
114 2         17 $c->register_keyword_parser(
115             'extends',
116             [$class, 'parse_extends_args', $used_module],
117             );
118             }
119              
120             sub remove_extends_and_with {
121 1     1 0 3 my ($class, $c, $used_module, $raw_tokens) = @_;
122              
123 1         3 $c->remove_keyword('extends');
124 1         2 $c->remove_keyword('with');
125             }
126              
127             sub remove_with {
128 0     0 0 0 my ($class, $c, $used_module, $raw_tokens) = @_;
129              
130 0         0 $c->remove_keyword('with');
131             }
132              
133             sub remove_extends {
134 0     0 0 0 my ($class, $c, $used_module, $raw_tokens) = @_;
135              
136 0         0 $c->remove_keyword('extends');
137             }
138              
139 27     27 0 82 sub parse_extends_args { shift->_parse_loader_args(@_) }
140 35     35 0 128 sub parse_with_args { shift->_parse_loader_args(@_) }
141              
142             sub _parse_loader_args {
143 62     62   141 my ($class, $c, $used_module, $raw_tokens) = @_;
144              
145 62         176 my $tokens = convert_string_tokens($raw_tokens);
146 62         111 shift @$tokens; # discard extends, with;
147              
148 62         91 my $prev;
149 62         118 for my $token (@$tokens) {
150 244 100       398 if (!ref $token) {
151 91         239 $c->add($token => 0);
152 91         2992 $prev = $token;
153 91         144 next;
154             }
155 153   100     306 my $desc = $token->[1] || '';
156 153 100       436 if ($desc eq '{}') {
157 29 50       34 my @hash_tokens = @{$token->[0] || []};
  29         80  
158 29         67 for(my $i = 0, my $len = @hash_tokens; $i < $len; $i++) {
159 104 100 66     2650 if ($hash_tokens[$i][0] eq '-version' and $i < $len - 2) {
160 27         51 my $maybe_version_token = $hash_tokens[$i + 2];
161 27         36 my $maybe_version = $maybe_version_token->[0];
162 27 100       48 if (ref $maybe_version) {
163 18         26 $maybe_version = $maybe_version->[0];
164             }
165 27 50 33     66 if ($prev and is_version($maybe_version)) {
166 27         56 $c->add($prev => $maybe_version);
167             }
168             }
169             }
170             }
171             }
172             }
173              
174             1;
175              
176             __END__