maintain $env->{Web::Dispatch.original_env} for ParamParser to cache in
[catagits/Web-Simple.git] / lib / Web / Dispatch / Predicates.pm
index 758afed..dae4a80 100644 (file)
@@ -5,14 +5,14 @@ use base qw(Exporter);
 
 our @EXPORT = qw(
   match_and match_or match_not match_method match_path match_path_strip
-  match_extension match_query match_body
+  match_extension match_query match_body match_uploads
 );
 
 sub match_and {
   my @match = @_;
   sub {
     my ($env) = @_;
-    my $my_env = { %$env };
+    my $my_env = { 'Web::Dispatch.original_env' => $env, %$env };
     my $new_env;
     my @got;
     foreach my $match (@match) {
@@ -102,24 +102,23 @@ sub match_extension {
 }
 
 sub match_query {
-  my $spec = shift;
-  require Web::Dispatch::ParamParser;
-  sub {
-    _extract_params(
-      Web::Dispatch::ParamParser::get_unpacked_query_from($_[0]),
-      $spec
-    )
-  };
+  _param_matcher(query => $_[0]);
 }
 
 sub match_body {
-  my $spec = shift;
+  _param_matcher(body => $_[0]);
+}
+
+sub match_uploads {
+  _param_matcher(uploads => $_[0]);
+}
+
+sub _param_matcher {
+  my ($type, $spec) = @_;
   require Web::Dispatch::ParamParser;
+  my $unpack = Web::Dispatch::ParamParser->can("get_unpacked_${type}_from");
   sub {
-    _extract_params(
-      Web::Dispatch::ParamParser::get_unpacked_body_from($_[0]),
-      $spec
-    )
+    _extract_params($unpack->($_[0]), $spec)
   };
 }