From: Sebastian Riedel Date: Fri, 25 Mar 2005 22:05:08 +0000 (+0000) Subject: improved forward() X-Git-Tag: 5.7099_04~1679 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=2deb0d7caa969d29055d4bae4151a4d1699ca352;hp=57221a474fe5ae3496cbda08ac7dd67508253861 improved forward() --- diff --git a/lib/Catalyst/Engine.pm b/lib/Catalyst/Engine.pm index 82f1092..98766fb 100644 --- a/lib/Catalyst/Engine.pm +++ b/lib/Catalyst/Engine.pm @@ -286,6 +286,7 @@ If you define a class without method it will default to process(). sub forward { my $c = shift; my $command = shift; + $c->state(0); unless ($command) { $c->log->debug('Nothing to forward to') if $c->debug; return 0; @@ -301,22 +302,13 @@ sub forward { } my $results = $c->get_action( $command, $namespace ); if ( @{$results} ) { - if ( $command =~ /^\!/ ) { - for my $result ( @{$results} ) { - my ( $class, $code ) = @{ $result->[0] }; - $c->state( $c->process( $class, $code ) ); - } - } - else { - return 0 unless my $result = $results->[0]; - if ( $result->[2] ) { + unless ( $command =~ /^\!/ ) { + $results = [ pop @{$results} ]; + if ( $results->[0]->[2] ) { $c->log->debug(qq/Couldn't forward "$command" to regex action/) if $c->debug; return 0; } - my ( $class, $code ) = @{ $result->[0] }; - $class = $c->components->{$class} || $class; - $c->state( $c->process( $class, $code ) ); } } else { @@ -328,8 +320,7 @@ sub forward { my $method = shift || 'process'; if ( my $code = $class->can($method) ) { $c->actions->{reverse}->{"$code"} = "$class->$method"; - $class = $c->comp($class) || $class; - $c->state( $c->process( $class, $code ) ); + $results = [ [ [ $class, $code ] ] ]; } else { $c->log->debug(qq/Couldn't forward to "$class->$method"/) @@ -337,6 +328,11 @@ sub forward { return 0; } } + for my $result ( @{$results} ) { + my ( $class, $code ) = @{ $result->[0] }; + $class = $c->comp->{$class} || $class; + $c->state( $c->process( $class, $code ) ); + } return $c->state; }