X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FDispatchType%2FChained.pm;h=7d0d42a548d8a911fee4b70dc54736a7a2b158cd;hb=9c74923de2304b8c8f0a7a2faa0854ad9b4d3a92;hp=be76915fa80f4d83d46d0aec4f80b15def114d26;hpb=fb34eb9c063c53abd061d260a30f0ca7c57a0833;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/DispatchType/Chained.pm b/lib/Catalyst/DispatchType/Chained.pm index be76915..7d0d42a 100644 --- a/lib/Catalyst/DispatchType/Chained.pm +++ b/lib/Catalyst/DispatchType/Chained.pm @@ -187,6 +187,7 @@ sub recurse_match { return () unless $children; my $best_action; my @captures; + my $found=0; TRY: foreach my $try_part (sort { length($b) <=> length($a) } keys %$children) { # $b then $a to try longest part first @@ -197,6 +198,7 @@ sub recurse_match { splice( # and strip them off @parts as well @parts, 0, scalar(@{[split('/', $try_part)]}) ))); # @{[]} to avoid split to @_ + $found=1; } my @try_actions = @{$children->{$try_part}}; TRY_ACTION: foreach my $action (@try_actions) { @@ -212,7 +214,7 @@ sub recurse_match { push(@captures, splice(@parts, 0, $capture_attr->[0])); # try the remaining parts against children of this action - my ($actions, $captures, $action_parts) = $self->recurse_match( + my ($actions, $captures, $action_parts, $found) = $self->recurse_match( $c, '/'.$action->reverse, \@parts ); # No best action currently @@ -220,13 +222,15 @@ sub recurse_match { # OR The action has equal parts but less captured data (ergo more defined) if ($actions && (!$best_action || - $#$action_parts < $#{$best_action->{parts}} || + $#$action_parts < $#{$best_action->{parts}} || ($#$action_parts == $#{$best_action->{parts}} && - $#$captures < $#{$best_action->{captures}}))){ + $#$captures < $#{$best_action->{captures}} && ($found > $best_action->{found}) + ))) { $best_action = { actions => [ $action, @$actions ], captures=> [ @captures, @$captures ], - parts => $action_parts + parts => $action_parts, + found=>$found }; } } @@ -250,13 +254,14 @@ sub recurse_match { $best_action = { actions => [ $action ], captures=> [], - parts => \@parts + parts => \@parts, + found=>$found, } } } } } - return @$best_action{qw/actions captures parts/} if $best_action; + return @$best_action{qw/actions captures parts found/} if $best_action; return (); }