1 package Web::Dispatch::Predicates;
7 match_and match_or match_not match_method match_path match_path_strip
15 my $my_env = { %$env };
18 foreach my $match (@match) {
19 if (my @this_got = $match->($my_env)) {
20 my %change_env = %{shift(@this_got)};
21 @{$my_env}{keys %change_env} = values %change_env;
22 @{$new_env}{keys %change_env} = values %change_env;
28 return ($new_env, @got);
35 foreach my $try (@match) {
36 if (my @ret = $try->(@_)) {
47 if (my @discard = $match->($_[0])) {
59 $env->{REQUEST_METHOD} eq $method ? {} : ()
67 if (my @cap = ($env->{PATH_INFO} =~ /$re/)) {
68 $cap[0] = {}; return @cap;
74 sub match_path_strip {
78 if (my @cap = ($env->{PATH_INFO} =~ /$re/)) {
80 SCRIPT_NAME => ($env->{SCRIPT_NAME}||'').$cap[0],
81 PATH_INFO => pop(@cap),
91 my $wild = (!$extension or $extension eq '*');
94 : qr/\.(\Q${extension}\E)$/;
96 if ($_[0]->{PATH_INFO} =~ $re) {
97 ($wild ? ({}, $1) : {});
104 sub _extract_params {
105 my ($raw, $spec) = @_;
106 foreach my $name (@{$spec->{required}||[]}) {
107 return unless exists $raw->{$name};
112 $_->{multi} ? $raw->{$_->{name}}||[] : $raw->{$_->{name}}->[-1]
113 } @{$spec->{positional}||[]}
115 # separated since 'or' is short circuit
116 my ($named, $star) = ($spec->{named}, $spec->{star});
117 if ($named or $star) {
123 : map $_->[-1], values %$raw
126 foreach my $n (@{$named||[]}) {
127 next if !$n->{multi} and !exists $raw->{$n->{name}};
129 $n->{multi} ? $raw->{$n->{name}}||[] : $raw->{$n->{name}}->[-1];