File Coverage

blib/lib/Devel/Declare/MethodInstaller/Simple.pm
Criterion Covered Total %
statement 65 65 100.0
branch 10 10 100.0
condition n/a
subroutine 17 18 94.4
pod 0 6 0.0
total 92 99 92.9


line stmt bran cond sub pod time code
1             package Devel::Declare::MethodInstaller::Simple;
2              
3 4     4   281509 use base 'Devel::Declare::Context::Simple';
  4         44  
  4         1982  
4              
5 4     4   27 use Devel::Declare ();
  4         9  
  4         75  
6 4     4   1897 use Sub::Name;
  4         2013  
  4         198  
7 4     4   26 use strict;
  4         9  
  4         75  
8 4     4   21 use warnings;
  4         16  
  4         288  
9              
10             our $VERSION = '0.006_020';
11             $VERSION =~ tr/_//d;
12              
13             sub install_methodhandler {
14 5     5 0 236 my $class = shift;
15 5         21 my %args = @_;
16             {
17 4     4   24 no strict 'refs';
  4         9  
  4         973  
  5         12  
18 5     0   20 *{$args{into}.'::'.$args{name}} = sub (&) {};
  5         40  
19             }
20              
21 5         698 my $warnings = warnings::enabled("redefine");
22 5         47 my $ctx = $class->new(%args);
23             Devel::Declare->setup_for(
24             $args{into},
25 18     18   60 { $args{name} => { const => sub { $ctx->parser(@_, $warnings) } } }
26 5         60 );
27             }
28              
29             sub code_for {
30 18     18 0 67 my ($self, $name) = @_;
31              
32 18 100       49 if (defined $name) {
33 14         46 my $pkg = $self->get_curstash_name;
34 14 100       76 $name = join( '::', $pkg, $name )
35             unless( $name =~ /::/ );
36             return sub (&) {
37 11     11   3654 my $code = shift;
38             # So caller() gets the subroutine name
39 4     4   31 no strict 'refs';
  4         9  
  4         384  
40             my $installer = $self->warning_on_redefine
41 10         63 ? sub { *{$name} = subname $name => $code; }
  10         58  
42 4     4   27 : sub { no warnings 'redefine';
  4         10  
  4         1437  
43 11 100       65 *{$name} = subname $name => $code; };
  1         8  
  1         8  
44 11         32 $installer->();
45 11         57 return;
46 14         114 };
47             } else {
48 4     4   20 return sub (&) { shift };
  4         31  
49             }
50             }
51              
52             sub install {
53 18     18 0 40 my ($self, $name ) = @_;
54              
55 18         54 $self->shadow( $self->code_for($name) );
56             }
57              
58             sub parser {
59 18     18 0 33 my $self = shift;
60 18         77 $self->init(@_);
61              
62 18         89 $self->skip_declarator;
63 18         81 my $name = $self->strip_name;
64 18         63 my $proto = $self->strip_proto;
65 18         68 my $attrs = $self->strip_attrs;
66 18         47 my @decl = $self->parse_proto($proto);
67 18         136 my $inject = $self->inject_parsed_proto(@decl);
68 18 100       70 if (defined $name) {
69 14         42 $inject = $self->scope_injector_call() . $inject;
70             }
71 18 100       134 $self->inject_if_block($inject, $attrs ? "sub ${attrs} " : '');
72              
73 18         55 $self->install( $name );
74              
75 18         119 return;
76             }
77              
78 8     8 0 19 sub parse_proto { '' }
79              
80             sub inject_parsed_proto {
81 18     18 0 35 return $_[1];
82             }
83              
84             1;
85