From: Ferruccio Zamuner Date: Sat, 27 Nov 2010 21:15:28 +0000 (+0000) Subject: Fixed chained action order resolution to pass t/aggregate/live__component_controller_... X-Git-Tag: 5.80030~22 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=8df53bed55eff8f87a6d62e6e07be033298796a7 Fixed chained action order resolution to pass t/aggregate/live__component_controller_action_chained2.t and without break any other test. --- diff --git a/lib/Catalyst/DispatchType/Chained.pm b/lib/Catalyst/DispatchType/Chained.pm index be76915..95e0bcd 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 (); }