File Coverage

blib/lib/Block/NamedVar/ForLike.pm
Criterion Covered Total %
statement 60 64 93.7
branch 12 16 75.0
condition n/a
subroutine 11 11 100.0
pod 4 6 66.6
total 87 97 89.6


line stmt bran cond sub pod time code
1             package Block::NamedVar::ForLike;
2 6     6   8550 use strict;
  6         24  
  6         270  
3 6     6   42 use warnings;
  6         18  
  6         270  
4              
5 6     6   48 use Devel::Declare::Interface;
  6         18  
  6         738  
6 6     6   90 use base 'Devel::Declare::Parser';
  6         12  
  6         8598  
7              
8             Devel::Declare::Interface::register_parser( 'for_var' );
9             __PACKAGE__->add_accessor( $_ ) for qw/dec vars list var_count/;
10              
11 36     36 1 8424 sub is_contained{ 0 }
12              
13             sub rewrite {
14 36     36 1 31782 my $self = shift;
15              
16 36 50       48 if ( @{ $self->parts } > 3 ) {
  36         108  
17 0         0 ( undef, undef, my @bad ) = @{ $self->parts };
  0         0  
18             $self->bail(
19             "Syntax error near: " . join( ' and ',
20 0         0 map { $self->format_part($_)} @bad
  0         0  
21             )
22             );
23             }
24              
25 36         222 my ($first, $second, $third) = @{ $self->parts };
  36         96  
26 36         198 my ( $dec, $vars, $list ) = ("");
27 36 100       36 if ( @{ $self->parts } > 2 ) {
  36 100       108  
28             $self->bail(
29             "Syntax error near: " . $self->format_part($first)
30 24 50       144 ) unless grep { $first->[0] eq $_ } qw/my our/;
  48         150  
31 24         42 $dec = $first;
32 24         36 $vars = $second;
33 24         36 $list = $third;
34             }
35 12         84 elsif ( @{ $self->parts } < 2 ) {
36 6         42 $dec = ['local'];
37 6         66 $vars = [' $a, $b ', '('];
38 6         12 $list = $first;
39             }
40             else {
41 6         36 $vars = $first;
42 6         12 $list = $second;
43             }
44              
45 36         90 $self->vars( $self->format_vars( $vars ));
46 36         234 $self->var_count( $self->count_vars );
47 36         246 $self->dec( $dec );
48 36         222 $self->list( $list );
49              
50 36         228 $self->new_parts([]);
51 36         210 1;
52             }
53              
54             sub format_vars {
55 36     36 0 54 my $self = shift;
56 36         66 my ( $vars ) = @_;
57 36 100       132 return $vars if ref $vars;
58 18         72 return [ $vars, '(' ];
59             }
60              
61             sub count_vars {
62 36     36 0 42 my $self = shift;
63 36         84 my @sigils = ($self->vars->[0] =~ m/\$/g);
64 36         324 my @bad = $self->vars->[0] =~ m/[\@\*\%]/g;
65 36 50       252 die( "nfor can only use a list of scalars, not " . join( ', ', @bad ))
66             if @bad;
67 36         126 return scalar @sigils;
68             }
69              
70 36     36 1 612 sub close_line {''};
71              
72             sub open_line {
73 36     36 1 204 my $self = shift;
74 36 100       84 my $dec = $self->dec ? $self->dec->[0] : '';
75 36         348 my $vars = $self->vars;
76 36         210 return "; for my \$__ ( "
77             . __PACKAGE__
78             . '::_nfor('
79             . $self->var_count
80             . ", "
81             . $self->list->[0]
82             . ")) { "
83             . "$dec ($vars->[0]) = \@\$__; ";
84             }
85              
86             sub _nfor {
87 6 50   6   85 return unless @_;
88 6         61 my ( $num, @list ) = @_;
89 6         24 my $i = 0;
90 6         15 my @out;
91 6         45 while ( $i < @list ) {
92 11         55 push @out => [ @list[ $i .. ($i + $num - 1)] ];
93 11         35 $i += $num;
94             }
95 6         25 return @out;
96             }
97              
98             1;
99              
100             __END__