enable matching of empty string specs
[catagits/Web-Simple.git] / lib / Web / Dispatch.pm
index 8fa3cd3..69df554 100644 (file)
@@ -33,7 +33,7 @@ sub call {
 
 sub _dispatch {
   my ($self, $env, @match) = @_;
-  while (my $try = shift @match) {
+  while (defined(my $try = shift @match)) {
 
     return $try if ref($try) eq 'ARRAY';
     if (ref($try) eq 'HASH') {
@@ -45,8 +45,11 @@ sub _dispatch {
     next unless @result and defined($result[0]);
 
     my $first = $result[0];
-    my $dispatch = $self->_valid_dispatch( $first, \@result, \@match, $env );
-    return $dispatch if $dispatch;
+
+    if (my $res = $self->_have_result( $first, \@result, \@match, $env )) {
+
+      return $res;
+    }
 
     # make a copy so we don't screw with it assigning further up
     my $env = $env;
@@ -56,17 +59,17 @@ sub _dispatch {
   return;
 }
 
-sub _valid_dispatch {
+sub _have_result {
   my ( $self, $first, $result, $match, $env ) = @_;
 
   if ( ref($first) eq 'ARRAY' ) {
     return $self->_unpack_array_match( $first );
   }
   elsif ( blessed($first) && $first->isa('Plack::Middleware') ) {
-    return $self->_prepare_middleware( $first, $result );
+    return $self->_uplevel_middleware( $first, $result );
   }
   elsif ( ref($first) eq 'HASH' and $first->{+MAGIC_MIDDLEWARE_KEY} ) {
-    return $self->_unwrap_middleware( $first, $match, $env );
+    return $self->_redispatch_with_middleware( $first, $match, $env );
   }
   elsif ( blessed($first) && !$first->can('to_app') ) {
     return $first;
@@ -81,7 +84,7 @@ sub _unpack_array_match {
   return $match;
 }
 
-sub _prepare_middleware {
+sub _uplevel_middleware {
   my ( $self, $match, $results ) = @_;
   die "Multiple results but first one is a middleware ($match)"
     if @{$results} > 1;
@@ -90,7 +93,7 @@ sub _prepare_middleware {
   return { MAGIC_MIDDLEWARE_KEY, $match };
 }
 
-sub _unwrap_middleware {
+sub _redispatch_with_middleware {
   my ( $self, $first, $match, $env ) = @_;
 
   my $mw = $first->{+MAGIC_MIDDLEWARE_KEY};
@@ -104,16 +107,12 @@ sub _to_try {
   my ($self, $try, $more) = @_;
   if (ref($try) eq 'CODE') {
     if (defined(my $proto = prototype($try))) {
-      $self->_construct_node(
-        match => $self->_parser->parse($proto), run => $try
-      )->to_app;
+      $self->_construct_node( match=> $proto, run => $try )->to_app;
     } else {
       $try
     }
   } elsif (!ref($try) and ref($more->[0]) eq 'CODE') {
-    $self->_construct_node(
-      match => $self->_parser->parse($try), run => shift(@$more)
-    )->to_app;
+    $self->_construct_node( match => $try, run => shift(@$more) )->to_app;
   } elsif (blessed($try) && $try->can('to_app')) {
     $try->to_app;
   } else {
@@ -123,6 +122,7 @@ sub _to_try {
 
 sub _construct_node {
   my ($self, %args) = @_;
+  $args{match} = $self->_parser->parse( $args{match} );
   $self->node_class->new({ %{$self->node_args}, %args });
 }