X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FDispatcher.pm;h=b4e3dc2d4ddb1d947a583a0f130334c4fd6fe243;hb=ba3c3e8604014602dee49df10bacaecdfce180a0;hp=fd9410b43e4bc6028431865fdc9ea2c5ba5aa86b;hpb=6f1f968a6bc42bf4a4b50a1ee22d3aaecd801876;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Dispatcher.pm b/lib/Catalyst/Dispatcher.pm index fd9410b..b4e3dc2 100644 --- a/lib/Catalyst/Dispatcher.pm +++ b/lib/Catalyst/Dispatcher.pm @@ -1,7 +1,5 @@ package Catalyst::Dispatcher; -use MRO::Compat; -use mro 'c3'; use Moose; use Class::MOP; @@ -122,17 +120,15 @@ sub dispatch { } } -=head2 $self->forward( $c, $command [, \@arguments ] ) - -Documented in L - -=cut +# $self->_command2action( $c, $command [, \@arguments ] ) +# Search for an action, from the command and returns C<($action, $args)> on +# success. Returns C<(0)> on error. -sub forward { +sub _command2action { my ( $self, $c, $command, @extra_params ) = @_; unless ($command) { - $c->log->debug('Nothing to forward to') if $c->debug; + $c->log->debug('Nothing to go to') if $c->debug; return 0; } @@ -141,21 +137,65 @@ sub forward { if ( ref( $extra_params[-1] ) eq 'ARRAY' ) { @args = @{ pop @extra_params } } else { - # this is a copy, it may take some abuse from ->_invoke_as_path if the path had trailing parts + # this is a copy, it may take some abuse from + # ->_invoke_as_path if the path had trailing parts @args = @{ $c->request->arguments }; } my $action; - # forward to a string path ("/foo/bar/gorch") or action object which stringifies to that + # go to a string path ("/foo/bar/gorch") + # or action object which stringifies to that $action = $self->_invoke_as_path( $c, "$command", \@args ); - # forward to a component ( "MyApp::*::Foo" or $c->component("...") - a path or an object) + # go to a component ( "MyApp::*::Foo" or $c->component("...") + # - a path or an object) unless ($action) { my $method = @extra_params ? $extra_params[0] : "process"; $action = $self->_invoke_as_component( $c, $command, $method ); } + return $action, \@args; +} + +=head2 $self->go( $c, $command [, \@arguments ] ) + +Documented in L + +=cut + +sub go { + my $self = shift; + my ( $c, $command ) = @_; + my ( $action, $args ) = $self->_command2action(@_); + + unless ($action && defined $action->namespace) { + my $error = + qq/Couldn't go to command "$command": / + . qq/Invalid action or component./; + $c->error($error); + $c->log->debug($error) if $c->debug; + return 0; + } + + local $c->request->{arguments} = $args; + $c->namespace($action->namespace); + $c->action($action); + $self->dispatch($c); + + die $Catalyst::GO; +} + +=head2 $self->forward( $c, $command [, \@arguments ] ) + +Documented in L + +=cut + +sub forward { + my $self = shift; + my ( $c, $command ) = @_; + my ( $action, $args ) = $self->_command2action(@_); unless ($action) { my $error = @@ -171,7 +211,7 @@ sub forward { no warnings 'recursion'; my $orig_args = $c->request->arguments(); - $c->request->arguments(\@args); + $c->request->arguments($args); $action->dispatch( $c ); $c->request->arguments($orig_args); @@ -285,7 +325,7 @@ sub prepare_action { s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg for grep { defined } @{$req->captures||[]}; $c->log->debug( 'Path is "' . $req->match . '"' ) - if ( $c->debug && $req->match ); + if ( $c->debug && length $req->match ); $c->log->debug( 'Arguments are "' . join( '/', @args ) . '"' ) if ( $c->debug && @args ); @@ -301,7 +341,7 @@ sub get_action { my ( $self, $name, $namespace ) = @_; return unless $name; - $namespace = join( "/", grep { length } split '/', $namespace || "" ); + $namespace = join( "/", grep { length } split '/', ( defined $namespace ? $namespace : "" ) ); return $self->_action_hash->{"${namespace}/${name}"}; } @@ -533,10 +573,9 @@ __PACKAGE__->meta->make_immutable; Provided by Moose -=head1 AUTHOR +=head1 AUTHORS -Sebastian Riedel, C -Matt S Trout, C +Catalyst Contributors, see Catalyst.pm =head1 COPYRIGHT