isolate param matching in Predicates
Matt S Trout [Wed, 15 Dec 2010 21:07:58 +0000 (21:07 +0000)]
lib/Web/Dispatch/ParamParser.pm [moved from lib/Web/Simple/ParamParser.pm with 97% similarity]
lib/Web/Dispatch/Parser.pm
lib/Web/Dispatch/Predicates.pm
t/param_parser.t

similarity index 97%
rename from lib/Web/Simple/ParamParser.pm
rename to lib/Web/Dispatch/ParamParser.pm
index 46f8533..c665502 100644 (file)
@@ -1,4 +1,4 @@
-package Web::Simple::ParamParser;
+package Web::Dispatch::ParamParser;
 
 use strict;
 use warnings FATAL => 'all';
index 2e2afba..ad05e5d 100644 (file)
@@ -169,9 +169,6 @@ sub _url_path_segment_match {
 sub _parse_param_handler {
   my ($self, $spec, $type) = @_;
 
-  require Web::Simple::ParamParser;
-  my $unpacker = Web::Simple::ParamParser->can("get_unpacked_${type}_from");
-
   for ($_[1]) {
     my (@required, @single, %multi, $star, $multistar, %positional, $have_kw);
     my %spec;
@@ -218,10 +215,7 @@ sub _parse_param_handler {
       }
     } while (/\G\&/gc) }
 
-    return sub {
-      my $raw = $unpacker->($_[0]);
-      Web::Dispatch::Predicates::_extract_params($raw, \%spec);
-    };
+    return Web::Dispatch::Predicates->can("match_${type}")->(\%spec);
   }
 }
 
index 432058c..758afed 100644 (file)
@@ -5,7 +5,7 @@ use base qw(Exporter);
 
 our @EXPORT = qw(
   match_and match_or match_not match_method match_path match_path_strip
-  match_extension
+  match_extension match_query match_body
 );
 
 sub match_and {
@@ -101,6 +101,28 @@ 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
+    )
+  };
+}
+
+sub match_body {
+  my $spec = shift;
+  require Web::Dispatch::ParamParser;
+  sub {
+    _extract_params(
+      Web::Dispatch::ParamParser::get_unpacked_body_from($_[0]),
+      $spec
+    )
+  };
+}
+
 sub _extract_params {
   my ($raw, $spec) = @_;
   foreach my $name (@{$spec->{required}||[]}) {
index dfa263c..87a3999 100644 (file)
@@ -3,7 +3,7 @@ use warnings FATAL => 'all';
 
 use Test::More qw(no_plan);
 
-use Web::Simple::ParamParser;
+use Web::Dispatch::ParamParser;
 
 my $param_sample = 'foo=bar&baz=quux&foo=%2F';
 my $unpacked = {
@@ -17,7 +17,7 @@ my $unpacked = {
 };
 
 is_deeply(
-  Web::Simple::ParamParser::_unpack_params('foo=bar&baz=quux&foo=%2F'),
+  Web::Dispatch::ParamParser::_unpack_params('foo=bar&baz=quux&foo=%2F'),
   $unpacked,
   'Simple unpack ok'
 );
@@ -25,13 +25,13 @@ is_deeply(
 my $env = { 'QUERY_STRING' => $param_sample };
 
 is_deeply(
-  Web::Simple::ParamParser::get_unpacked_query_from($env),
+  Web::Dispatch::ParamParser::get_unpacked_query_from($env),
   $unpacked,
   'Dynamic unpack ok'
 );
 
 is_deeply(
-  $env->{+Web::Simple::ParamParser::UNPACKED_QUERY},
+  $env->{+Web::Dispatch::ParamParser::UNPACKED_QUERY},
   $unpacked,
   'Unpack cached ok'
 );