File Coverage

blib/lib/Kavorka/MethodModifier.pm
Criterion Covered Total %
statement 46 48 95.8
branch 4 10 40.0
condition n/a
subroutine 13 16 81.2
pod 0 5 0.0
total 63 79 79.7


line stmt bran cond sub pod time code
1 9     9   3317 use 5.014;
  9         20  
2 9     9   29 use strict;
  9         10  
  9         167  
3 9     9   26 use warnings;
  9         12  
  9         182  
4              
5 9     9   30 use Kavorka::Parameter ();
  9         11  
  9         106  
6 9     9   27 use Role::Tiny ();
  9         7  
  9         4383  
7              
8             my $DETECT_OO = do {
9             my %_detect_oo; # memoize
10             sub {
11             my $pkg = $_[0];
12            
13             return $_detect_oo{$pkg} if exists $_detect_oo{$pkg};
14            
15             if ($pkg->can("meta"))
16             {
17             my $meta = $pkg->meta;
18            
19             return $_detect_oo{$pkg} = "Moo::Role"
20             if 'Role::Tiny'->is_role($pkg)
21             && ref($meta) eq "Moo::HandleMoose::FakeMetaClass";
22             return $_detect_oo{$pkg} = "Moo"
23             if ref($meta) eq "Moo::HandleMoose::FakeMetaClass";
24             return $_detect_oo{$pkg} = "Mouse"
25             if $meta->isa("Mouse::Meta::Module");
26             return $_detect_oo{$pkg} = "Moose"
27             if $meta->isa("Moose::Meta::Class");
28             return $_detect_oo{$pkg} = "Moose"
29             if $meta->isa("Moose::Meta::Role");
30             }
31            
32             return $_detect_oo{$pkg} = "Role::Tiny"
33             if 'Role::Tiny'->is_role($pkg);
34            
35             return $_detect_oo{$pkg} = "";
36             }
37             };
38              
39             my $INSTALL_MM = sub {
40             my ($modification, $names, $code) = @_;
41            
42             for my $name (@$names)
43             {
44             my ($package, $method) = ($name =~ /\A(.+)::(\w+)\z/);
45             my $OO = $package->$DETECT_OO;
46            
47             if ($OO eq 'Moose')
48             {
49             require Moose::Util;
50             my $installer = sprintf('add_%s_method_modifier', $modification);
51             Moose::Util::find_meta($package)->$installer($method, $code);
52             }
53            
54             elsif ($OO eq 'Mouse')
55             {
56             require Mouse::Util;
57             my $installer = sprintf('add_%s_method_modifier', $modification);
58             Mouse::Util::find_meta($package)->$installer($method, $code);
59             }
60            
61             elsif ($OO eq 'Role::Tiny')
62             {
63             require Class::Method::Modifiers;
64             push @{$Role::Tiny::INFO{$package}{modifiers}||=[]}, [ $modification, $method, $code ];
65             }
66            
67             elsif ($OO eq 'Moo::Role')
68             {
69             require Class::Method::Modifiers;
70             push @{$Role::Tiny::INFO{$package}{modifiers}||=[]}, [ $modification, $method, $code ];
71             $OO->_maybe_reset_handlemoose($package);
72             }
73            
74             elsif ($OO eq 'Moo')
75             {
76             require Class::Method::Modifiers;
77             require Moo::_Utils;
78             Moo::_Utils::_install_modifier($package, $modification, $method, $code);
79             }
80            
81             else
82             {
83             require Class::Method::Modifiers;
84             Class::Method::Modifiers::install_modifier($package, $modification, $method, $code);
85             }
86             }
87             };
88              
89             package Kavorka::MethodModifier;
90              
91             our $AUTHORITY = 'cpan:TOBYINK';
92             our $VERSION = '0.037';
93              
94 9     9   43 use Parse::Keyword {};
  9         9  
  9         93  
95 9     9   735 use Parse::KeywordX;
  9         12  
  9         57  
96 9     9   2399 use Scalar::Util qw(reftype);
  9         12  
  9         511  
97              
98 9     9   31 use Moo::Role;
  9         10  
  9         52  
99             with 'Kavorka::Sub';
100 9     9   8090 use namespace::sweep;
  9         12  
  9         66  
101              
102             requires 'method_modifier';
103              
104             has more_names => (is => 'ro', default => sub { [] });
105              
106             sub bypass_custom_parsing
107             {
108 3     3 0 3 my $class = shift;
109 3         4 my ($keyword, $caller, $args) = @_;
110            
111 3         5 my $coderef = pop @$args;
112            
113       0     reftype($coderef) eq reftype(sub {})
114 3 50       17 or croak('Not a valid coderef');
115            
116             my @qnames =
117 3 50       21 map { /::/ ? $_ : sprintf('%s::%s', $caller, $_) }
118 3 0       10 map { !ref($_) ? $_ : reftype($_) eq reftype([]) ? @$_ : croak("Not an array or string: $_") }
  3 50       10  
119             @$args;
120            
121 3         13 $INSTALL_MM->(
122             $class->method_modifier,
123             \@qnames,
124             $coderef,
125             );
126             }
127              
128             after parse_subname => sub
129             {
130             my $self = shift;
131             lex_read_space;
132             while (lex_peek eq ',')
133             {
134             lex_read(1);
135             lex_read_space;
136             push @{$self->more_names}, scalar Kavorka::_fqname(parse_name('method', 1));
137             lex_read_space;
138             }
139             };
140              
141 0     0 0 0 sub allow_anonymous { 0 }
142 0     0 0 0 sub allow_lexical { 0 }
143              
144             sub default_invocant
145             {
146 14     14 0 23 my $self = shift;
147             return (
148 14         256 'Kavorka::Parameter'->new(
149             name => '$self',
150             traits => { invocant => 1 },
151             ),
152             );
153             }
154              
155             sub install_sub
156             {
157 19     19 0 25 my $self = shift;
158 19         46 my $code = $self->body;
159            
160 19         72 my $modification = $self->method_modifier;
161            
162 19 50       71 my @names = $self->qualified_name or die;
163 19         24 push @names, @{$self->more_names};
  19         52  
164            
165 19         49 $INSTALL_MM->($modification, \@names, $code);
166             }
167              
168             1;