use strictures 1;
use base qw(Exporter);
-our @EXPORT = qw(match_and match_or match_method match_path match_path_strip);
+our @EXPORT = qw(
+ match_and match_or match_method match_path match_path_strip
+ match_extension
+);
sub match_and {
my @match = @_;
my @got;
foreach my $match (@match) {
if (my @this_got = $match->($my_env)) {
- my %change_env = %{shift(@this_got)};
- @{$my_env}{keys %change_env} = values %change_env;
- @{$new_env}{keys %change_env} = values %change_env;
- push @got, @this_got;
+ my %change_env = %{shift(@this_got)};
+ @{$my_env}{keys %change_env} = values %change_env;
+ @{$new_env}{keys %change_env} = values %change_env;
+ push @got, @this_got;
} else {
- return;
+ return;
}
}
return ($new_env, @got);
my ($env) = @_;
if (my @cap = ($env->{PATH_INFO} =~ /$re/)) {
$cap[0] = {
- SCRIPT_NAME => ($env->{SCRIPT_NAME}||'').$cap[0],
- PATH_INFO => pop(@cap),
+ SCRIPT_NAME => ($env->{SCRIPT_NAME}||'').$cap[0],
+ PATH_INFO => pop(@cap),
};
return @cap;
}
}
}
+sub match_extension {
+ my ($extension) = @_;
+ my $wild = (!$extension or $extension eq '*');
+ my $re = $wild
+ ? qr/\.(\w+)$/
+ : qr/\.(\Q${extension}\E)$/;
+ sub {
+ if ($_[0]->{PATH_INFO} =~ $re) {
+ ($wild ? ({}, $1) : {});
+ } else {
+ ();
+ }
+ };
+}
+
1;