X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FDispatcher.pm;h=858c1ec579a6c7177e852ec3fbc30a864d7afdb6;hp=8f94316cd2624f4711425925e6fd3bfdba72cb6a;hb=4082e67814e85bc9820e56eb38e5e21511c0a5f8;hpb=a0eca83861c733269dbafbaafbcc3ca0b0101e2b diff --git a/lib/Catalyst/Dispatcher.pm b/lib/Catalyst/Dispatcher.pm index 8f94316..858c1ec 100644 --- a/lib/Catalyst/Dispatcher.pm +++ b/lib/Catalyst/Dispatcher.pm @@ -21,10 +21,10 @@ __PACKAGE__->mk_accessors( ); # Preload these action types -our @PRELOAD = qw/Path Regex/; +our @PRELOAD = qw/Index Path Regex/; # Postload these action types -our @POSTLOAD = qw/Index Default/; +our @POSTLOAD = qw/Default/; =head1 NAME @@ -38,9 +38,7 @@ See L. =head1 METHODS -=over 4 - -=item $self->detach( $c, $command [, \@arguments ] ) +=head2 $self->detach( $c, $command [, \@arguments ] ) =cut @@ -50,13 +48,12 @@ sub detach { die $Catalyst::DETACH; } -=item $self->dispatch($c) +=head2 $self->dispatch($c) =cut sub dispatch { my ( $self, $c ) = @_; - if ( $c->action ) { $c->forward( join( '/', '', $c->action->namespace, '_DISPATCH' ) ); } @@ -71,7 +68,7 @@ sub dispatch { } } -=item $self->forward( $c, $command [, \@arguments ] ) +=head2 $self->forward( $c, $command [, \@arguments ] ) =cut @@ -80,19 +77,17 @@ sub forward { my $c = shift; my $command = shift; - # Get the calling class - my $caller = ( caller(0) )[0]; - if ( $caller->isa('Catalyst') ) { - if ( ( caller(2) )[3] =~ /detach$/ ) { $caller = caller(3) } - elsif ( ( caller(0) )[3] =~ /forward$/ ) { $caller = caller(1) } - } - unless ($command) { $c->log->debug('Nothing to forward to') if $c->debug; return 0; } - my $arguments = ( ref( $_[-1] ) eq 'ARRAY' ) ? pop(@_) : $c->req->args; + my $local_args = 0; + my $arguments = $c->req->args; + if ( ref( $_[-1] ) eq 'ARRAY' ) { + $arguments = pop(@_); + $local_args = 1; + } my $result; @@ -100,11 +95,8 @@ sub forward { my $command_copy = $command; unless ( $command_copy =~ s/^\/// ) { - my $prefix = - Catalyst::Utils::class2prefix( $caller, - $c->config->{case_sensitive} ) - || ''; - $command_copy = "${prefix}/${command}"; + my $namespace = $c->stack->[-1]->namespace; + $command_copy = "${namespace}/${command}"; } unless ( $command_copy =~ /\// ) { @@ -116,8 +108,9 @@ sub forward { my $tail = $2; $result = $c->get_action( $tail, $1 ); if ($result) { - $command = $tail; - push( @{$arguments}, @extra_args ); + $local_args = 1; + $command = $tail; + unshift( @{$arguments}, @extra_args ); last DESCEND; } unshift( @extra_args, $tail ); @@ -127,8 +120,10 @@ sub forward { unless ($result) { - my $class = ref($command) || ref( $c->component($command) ); - my $method = shift || 'process'; + my $class = ref($command) + || ref( $c->component($command) ) + || $c->component($command); + my $method = shift || 'process'; unless ($class) { my $error = @@ -145,7 +140,9 @@ qq/Couldn't forward to command "$command". Invalid action or component./; code => $code, reverse => "$class->$method", class => $class, - namespace => $class, + namespace => Catalyst::Utils::class2prefix( + $class, $c->config->{case_sensitive} + ), } ); $result = $action; @@ -162,14 +159,16 @@ qq/Couldn't forward to command "$command". Invalid action or component./; } - local $c->request->{arguments} = [ @{$arguments} ]; - - $result->execute($c); + if ($local_args) { + local $c->request->{arguments} = [ @{$arguments} ]; + $result->execute($c); + } + else { $result->execute($c) } return $c->state; } -=item $self->prepare_action($c) +=head2 $self->prepare_action($c) =cut @@ -179,12 +178,13 @@ sub prepare_action { my @path = split /\//, $c->req->path; $c->req->args( \my @args ); - push( @path, '/' ) unless @path; # Root action + unshift( @path, '' ); # Root action DESCEND: while (@path) { $path = join '/', @path; + $path =~ s#^/##; - $path = '' if $path eq '/'; # Root action + $path = '' if $path eq '/'; # Root action # Check out dispatch types to see if any will handle the path at # this level @@ -194,15 +194,19 @@ sub prepare_action { } # If not, move the last part path to args - - unshift @args, pop @path; + my $arg = pop(@path); + $arg =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg; + unshift @args, $arg; } + $c->log->debug( 'Path is "' . $c->req->match . '"' ) + if ( $c->debug && $c->req->match ); + $c->log->debug( 'Arguments are "' . join( '/', @args ) . '"' ) if ( $c->debug && @args ); } -=item $self->get_action( $action, $namespace ) +=head2 $self->get_action( $action, $namespace ) =cut @@ -221,7 +225,7 @@ sub get_action { } } -=item $self->get_actions( $c, $action, $namespace ) +=head2 $self->get_actions( $c, $action, $namespace ) =cut @@ -236,7 +240,7 @@ sub get_actions { return map { $_->get_action($action) } @match; } -=item $self->get_containers( $namespace ) +=head2 $self->get_containers( $namespace ) =cut @@ -278,7 +282,7 @@ sub get_containers { return map { $_->getNodeValue } @match; } -=item $self->register( $c, $action ) +=head2 $self->register( $c, $action ) =cut @@ -338,7 +342,7 @@ sub register { $parent->getNodeValue->actions->{ $action->name } = $action; } -=item $self->setup_actions( $class, $component ) +=head2 $self->setup_actions( $class, $component ) =cut @@ -381,9 +385,9 @@ sub setup_actions { return unless $c->debug; my $privates = Text::SimpleTable->new( - [ 24, 'Private' ], - [ 23, 'Class' ], - [ 23, 'Method' ] + [ 20, 'Private' ], + [ 38, 'Class' ], + [ 12, 'Method' ] ); my $has_private = 0; @@ -413,8 +417,6 @@ sub setup_actions { $_->list($c) for @{ $self->dispatch_types }; } -=back - =head1 AUTHOR Sebastian Riedel, C