File Coverage

blib/lib/Block/NamedVar/MapLike.pm
Criterion Covered Total %
statement 50 55 90.9
branch 13 16 81.2
condition n/a
subroutine 9 9 100.0
pod 3 4 75.0
total 75 84 89.2


line stmt bran cond sub pod time code
1             package Block::NamedVar::MapLike;
2 6     6   5304 use strict;
  6         12  
  6         144  
3 6     6   30 use warnings;
  6         12  
  6         150  
4              
5 6     6   30 use Devel::Declare::Interface;
  6         6  
  6         384  
6 6     6   30 use base 'Devel::Declare::Parser';
  6         12  
  6         4032  
7              
8             Devel::Declare::Interface::register_parser( 'map_var' );
9             __PACKAGE__->add_accessor( $_ ) for qw/dec var/;
10              
11             sub rewrite {
12 42     42 1 44478 my $self = shift;
13              
14 42 50       66 if ( @{ $self->parts } > 2 ) {
  42         114  
15 0         0 ( undef, my @bad ) = @{ $self->parts };
  0         0  
16             $self->bail(
17             "Syntax error near: " . join( ' and ',
18 0         0 map { $self->format_part($_)} @bad
  0         0  
19             )
20             );
21             }
22              
23 42         252 my ($first, $second) = @{ $self->parts };
  42         114  
24 42         228 my ( $dec, $var ) = ("");
25 42 100       48 if ( @{ $self->parts } > 1 ) {
  42         120  
26             $self->bail(
27             "Syntax error near: " . $self->format_part($first)
28 30 50       174 ) unless grep { $first->[0] eq $_ } qw/my our/;
  60         174  
29 30         132 $dec = $first;
30 30         54 $var = $second;
31             }
32             else {
33 12         72 $var = $first;
34 12 100       36 $dec = ['my'] if ref $self->parts->[0];
35             }
36              
37 42         168 $var = $self->format_var( $var );
38 42         132 $self->dec( $dec );
39 42         378 $self->var( $var );
40              
41 42         294 $self->new_parts([]);
42 42         240 1;
43             }
44              
45             sub format_var {
46 42     42 0 54 my $self = shift;
47 42         60 my ( $var ) = @_;
48 42 100       102 if ( ref $var ) {
49 6         12 $var = $var->[0];
50             }
51 42 100       192 return $var if $var =~ m/^\$\w[\w\d_]*$/;
52 6 50       36 return "\$$var" if $var =~ m/^\w[\w\d_]*$/;
53 0         0 $self->bail( "Syntax error, '$var' is not a valid block variable name" );
54             }
55              
56             sub inject {
57 42     42 1 942 my $self = shift;
58 42 100       102 my $dec = $self->dec ? $self->dec->[0] : '';
59 42         432 my $var = $self->var;
60 42         324 return ( "$dec $var = \$_" );
61             }
62              
63             sub _scope_end {
64 42     42   5616 my $class = shift;
65 42         66 my ( $id ) = @_;
66 42         102 my $self = Devel::Declare::Parser::_unstash( $id );
67              
68 42         258 my $linestr = $self->line;
69 42         300 $self->offset( $self->_linestr_offset_from_dd() );
70 42         354 substr($linestr, $self->offset, 0) = ', ';
71 42         234 $self->line($linestr);
72             }
73              
74             sub open_line {
75 42     42 1 234 my $self = shift;
76 42         102 return "";
77             }
78              
79             1;
80              
81             __END__