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 83     83   1140 use strict;
  83         178  
  83         1825  
4 83     83   332 use warnings;
  83         147  
  83         1545  
5 83     83   349 use Perl::PrereqScanner::NotQuiteLite::Util;
  83         150  
  83         62695  
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 82     82 0 301 my ($class, %args) = @_;
48              
49             # Make sure everything is unique
50 82 50       167 my %exports_extends_and_with = map {$_ => 1} (@ExportsExtendsAndWith, @{$args{exports_extends_and_with} || []});
  3444         5790  
  82         503  
51 82 50       435 my %exports_extends = map {$_ => 1} (@ExportsExtends, @{$args{exports_extends} || []});
  738         1280  
  82         375  
52 82 50       178 my %exports_with = map {$_ => 1} (@ExportsWith, @{$args{exports_with} || []});
  1148         1963  
  82         1951  
53              
54 82         1532 for my $module (keys %exports_with) {
55 1148 50       1724 if (exists $exports_extends_and_with{$module}) {
56 0         0 delete $exports_with{$module};
57 0         0 next;
58             }
59 1148 50       1746 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 82         266 for my $module (keys %exports_extends) {
66 738 50       1131 if (exists $exports_extends_and_with{$module}) {
67 0         0 delete $exports_extends{$module};
68 0         0 next;
69             }
70             }
71              
72 82         151 my %mapping;
73 82         240 for my $module (keys %exports_with) {
74 1148         1682 $mapping{use}{$module} = 'register_with';
75 1148         1674 $mapping{no}{$module} = 'remove_with';
76             }
77 82         229 for my $module (keys %exports_extends) {
78 738         984 $mapping{use}{$module} = 'register_extends';
79 738         1031 $mapping{no}{$module} = 'remove_extends';
80             }
81 82         419 for my $module (keys %exports_extends_and_with) {
82 3444         4681 $mapping{use}{$module} = 'register_extends_and_with';
83 3444         4940 $mapping{no}{$module} = 'remove_extends_and_with';
84             }
85              
86 82         750 return \%mapping;
87             }
88              
89             sub register_extends_and_with {
90 54     54 0 198 my ($class, $c, $used_module, $raw_tokens) = @_;
91              
92 54         261 $c->register_keyword_parser(
93             'extends',
94             [$class, 'parse_extends_args', $used_module],
95             );
96 54         166 $c->register_keyword_parser(
97             'with',
98             [$class, 'parse_with_args', $used_module],
99             );
100             }
101              
102             sub register_with {
103 3     3 0 10 my ($class, $c, $used_module, $raw_tokens) = @_;
104              
105 3         16 $c->register_keyword_parser(
106             'with',
107             [$class, 'parse_with_args', $used_module],
108             );
109             }
110              
111             sub register_extends {
112 2     2 0 7 my ($class, $c, $used_module, $raw_tokens) = @_;
113              
114 2         9 $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         4 $c->remove_keyword('extends');
124 1         8 $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 164 sub parse_extends_args { shift->_parse_loader_args(@_) }
140 33     33 0 113 sub parse_with_args { shift->_parse_loader_args(@_) }
141              
142             sub _parse_loader_args {
143 60     60   158 my ($class, $c, $used_module, $raw_tokens) = @_;
144              
145 60         211 my $tokens = convert_string_tokens($raw_tokens);
146 60         315 shift @$tokens; # discard extends, with;
147              
148 60         78 my $prev;
149 60         127 for my $token (@$tokens) {
150 240 100       602 if (!ref $token) {
151 89         240 $c->add($token => 0);
152 89         2338 $prev = $token;
153 89         170 next;
154             }
155 151   100     317 my $desc = $token->[1] || '';
156 151 100       418 if ($desc eq '{}') {
157 29 50       44 my @hash_tokens = @{$token->[0] || []};
  29         76  
158 29         80 for(my $i = 0, my $len = @hash_tokens; $i < $len; $i++) {
159 104 100 66     2850 if ($hash_tokens[$i][0] eq '-version' and $i < $len - 2) {
160 27         48 my $maybe_version_token = $hash_tokens[$i + 2];
161 27         49 my $maybe_version = $maybe_version_token->[0];
162 27 100       51 if (ref $maybe_version) {
163 18         28 $maybe_version = $maybe_version->[0];
164             }
165 27 50 33     88 if ($prev and is_version($maybe_version)) {
166 27         63 $c->add($prev => $maybe_version);
167             }
168             }
169             }
170             }
171             }
172             }
173              
174             1;
175              
176             __END__