File Coverage

blib/lib/Switch/Again.pm
Criterion Covered Total %
statement 38 38 100.0
branch 14 14 100.0
condition 11 11 100.0
subroutine 10 10 100.0
pod 2 2 100.0
total 75 75 100.0


line stmt bran cond sub pod time code
1             package Switch::Again;
2 6     6   306407 use 5.006; use strict; use warnings; our $VERSION = '1.00';
  6     6   59  
  6     6   23  
  6         7  
  6         88  
  6         22  
  6         7  
  6         229  
3 6     6   2210 use Struct::Match qw/struct/;
  6         90446  
  6         35  
4 6     6   927 use base qw/Import::Export/;
  6         9  
  6         713  
5              
6             our %EX = (
7             'switch' => [qw/all/],
8             'sr' => [qw/all/]
9             );
10              
11             BEGIN {
12             @STRUCT{qw/Regexp CODE/} = (
13 9         44 sub { $_[1] =~ $_[0]; },
14 6         12 sub { my $v = eval { $_[0]->($_[1]) }; }
  6         11  
15 6     6   1483 );
16             }
17              
18             sub switch {
19 15     15 1 3274 my ($value, $default, @cases);
20 15 100       48 $value = shift if (scalar @_ % 2);
21              
22             $_[0] eq 'default'
23 9         49 ? do { shift; $default = shift }
  9         22  
24 15 100       49 : do { push @cases, { ref => $STRUCT{REF}($_[0]), case => shift, cb => shift } }
  26         144  
25             while (@_); # I could map to a hash but...
26              
27             my $evil = sub {
28 35     35   8511 my ($val, @result) = ($_[0]);
29             eval {
30 69         144 @result = $STRUCT{$_->{ref}}($_->{case}, $val);
31 69 100 100     1769 @result = () if @result && $result[0] eq '';
32 69         129 @result;
33             } and do {
34             @result = ref $_->{cb} eq 'CODE' ? $_->{cb}->($val, @result) : $_->{cb}
35 35 100 100     64 } and last for @cases;
  25   100     81  
36 34 100 100     231 @result ? wantarray ? @result : shift @result : $default && $default->($val);
    100          
37 15         73 };
38              
39 15 100       49 $value ? $evil->($value) : $evil;
40             }
41              
42             sub sr {
43 1     1 1 363 my ($search, $replace) = @_;
44 1     1   8 return sub {my $v589 = shift; $v589 =~ s/$search/$replace/g; $v589;};
  1         2  
  1         13  
  1         4  
45             }
46              
47             1;
48              
49             __END__;