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') {
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;
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;
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;
return { MAGIC_MIDDLEWARE_KEY, $match };
}
-sub _unwrap_middleware {
+sub _redispatch_with_middleware {
my ( $self, $first, $match, $env ) = @_;
my $mw = $first->{+MAGIC_MIDDLEWARE_KEY};
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 {
sub _construct_node {
my ($self, %args) = @_;
+ $args{match} = $self->_parser->parse( $args{match} );
$self->node_class->new({ %{$self->node_args}, %args });
}