File Coverage

blib/lib/Sub/PatternMatching.pm
Criterion Covered Total %
statement 15 39 38.4
branch 0 8 0.0
condition n/a
subroutine 5 8 62.5
pod 1 1 100.0
total 21 56 37.5


line stmt bran cond sub pod time code
1             package Sub::PatternMatching;
2              
3 1     1   1176 use 5.006;
  1         4  
  1         84  
4 1     1   6 use strict;
  1         2  
  1         36  
5 1     1   5 use warnings;
  1         2  
  1         38  
6 1     1   5 use Carp;
  1         1  
  1         225  
7 1     1   1065 use Params::Validate qw/:all/;
  1         81902  
  1         829  
8              
9             require Exporter;
10              
11             our $VERSION = '1.04';
12              
13             our @ISA = qw(Exporter);
14              
15             our %EXPORT_TAGS = (
16             'all' => [
17             qw(
18             patternmatch
19             )
20             ]
21             );
22              
23             our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
24              
25             our @EXPORT = qw(
26             patternmatch
27             );
28              
29             sub patternmatch {
30 0     0 1   my @patterns = validate_with(
31             params => \@_,
32             spec => [
33             { type => HASHREF | ARRAYREF },
34             { type => CODEREF },
35             (
36             ( { type => HASHREF | ARRAYREF }, { type => CODEREF } ) x
37             int( ( @_ - 2 ) / 2 )
38             ),
39             { type => CODEREF, optional => 1 }
40             ],
41             called => 'Sub::PatternMatching::patternmatch',
42             );
43              
44 0           my $default;
45 0 0         if ( @patterns % 2 ) {
46 0           $default = pop @patterns;
47             }
48             else {
49             $default = sub {
50 0     0     croak "Unmatched parameter pattern passed "
51             . "to patternmatched subroutine";
52 0           };
53             }
54              
55             my $f = sub {
56 0     0     local $@;
57 0           my $to_execute = $default;
58 0           foreach my $i ( 0 .. @patterns / 2 - 1 ) {
59 0           my $pat = $patterns[ $i * 2 ];
60 0 0         if ( ref($pat) eq 'ARRAY' ) {
61 0           eval { validate_pos( @_, @$pat ); };
  0            
62 0 0         next if $@;
63 0           $to_execute = $patterns[ $i * 2 + 1 ];
64 0           last;
65             }
66             else { # HASH
67 0           eval { validate( @_, $pat ); };
  0            
68 0 0         next if $@;
69 0           $to_execute = $patterns[ $i * 2 + 1 ];
70 0           last;
71             }
72             }
73 0           goto &$to_execute;
74 0           };
75              
76 0           return $f;
77             }
78              
79             1;
80             __END__