File Coverage

blib/lib/Acme/What.pm
Criterion Covered Total %
statement 61 61 100.0
branch 9 10 90.0
condition 2 2 100.0
subroutine 17 17 100.0
pod n/a
total 89 90 98.8


line stmt bran cond sub pod time code
1 1     1   36375 use 5.010;
  1         4  
  1         33  
2 1     1   4 use strict;
  1         2  
  1         22  
3 1     1   4 use warnings;
  1         5  
  1         50  
4              
5             package Acme::What;
6              
7             BEGIN {
8 1     1   1 $Acme::What::AUTHORITY = 'cpan:TOBYINK';
9 1         22 $Acme::What::VERSION = '0.004';
10             }
11              
12 1     1   792 use Devel::Declare;
  1         24020  
  1         10  
13 1     1   1527 use Sub::Util qw/set_subname/;
  1         432  
  1         91  
14              
15 1     1   7 use base qw/Devel::Declare::Context::Simple/;
  1         2  
  1         1417  
16              
17             sub import
18             {
19 1     1   27431 no strict 'refs';
  1         3  
  1         743  
20            
21 3     3   3702 my $caller = caller;
22 3         51 my $self = shift;
23 3   100     16 my $method = shift // 'WHAT';
24            
25 3         7 my $export = "$caller\::what";
26 3 100       11 unless ( exists &$export )
27             {
28 1 50       12 $self = $self->new unless ref $self;
29             Devel::Declare->setup_for(
30             $caller,
31 5     5   151 { what => { const => sub { $self->_parser(@_) } } }
32 1         23 );
33 1     5   55 *$export = set_subname($export => sub ($) { $self->_do(@_) });
  5     5   1138  
34             }
35            
36 3 100       158 $^H{(__PACKAGE__)} = $method =~ m{^\+(.+)$}
37             ? $1
38             : sprintf("$caller\::$method");
39             }
40              
41             sub unimport
42             {
43 1     1   217 $^H{(__PACKAGE__)} = undef;
44             }
45              
46             sub _parser
47             {
48 5     5   8 my $self = shift;
49 5         24 $self->init(@_);
50 5         66 $self->skip_declarator;
51 5         143 $self->skipspace;
52 5         48 my $linestr = $self->get_linestr;
53            
54 5         31 my $remaining = substr($linestr, $self->offset);
55            
56 5 100       37 if ($remaining =~ /^(.*?);(.*)$/)
57             {
58             # Found semicolon
59 2         6 my $quoted = $self->_quote($1);
60 2         11 substr($linestr, $self->offset) = "('$quoted');" . $2;
61             }
62             else
63             {
64 3         5 chomp $remaining;
65 3         7 my $quoted = $self->_quote($remaining);
66 3         12 substr($linestr, $self->offset) = "('$quoted');\n";
67             }
68            
69 5         38 $self->set_linestr($linestr);
70             }
71              
72             sub _quote
73             {
74 5     5   11 my ($self, $str) = @_;
75 5         8 $str =~ s{([\\\'])}{\\$1}g;
76 5         12 return $str;
77             }
78              
79             sub _do
80             {
81 1     1   8 no strict 'refs';
  1         2  
  1         171  
82 5     5   11 my ($self, @args) = @_;
83 5         17 my @caller = caller(1);
84            
85 5         120 my $meth = $caller[10]{ (__PACKAGE__) };
86            
87 5 100       16 if (not defined $meth) {
88 1         9 require Carp;
89 1         23 Carp::croak("Acme::What disabled");
90             }
91            
92 4         20 return $meth->(@args);
93             }
94              
95             __PACKAGE__
96             __END__