X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FDispatcher.pm;h=0fe6c32a337907ea923826049972e621bcaed856;hb=784ab0e42f27feccdf30543d909352ae8657cbeb;hp=1a1acbd729319ce510543c46b33cb8cccaad5ea7;hpb=6d030e6fc87ce5f0e9c4c9d0d5dccc90068b62c8;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Dispatcher.pm b/lib/Catalyst/Dispatcher.pm index 1a1acbd..0fe6c32 100644 --- a/lib/Catalyst/Dispatcher.pm +++ b/lib/Catalyst/Dispatcher.pm @@ -7,6 +7,7 @@ use Catalyst::Utils; use Catalyst::Action; use Catalyst::ActionContainer; use Catalyst::DispatchType::Default; +use Catalyst::DispatchType::Index; use Text::ASCIITable; use Tree::Simple; use Tree::Simple::Visitor::FindByPath; @@ -19,6 +20,9 @@ __PACKAGE__->mk_accessors(qw/tree dispatch_types/); # Preload these action types our @PRELOAD = qw/Path Regex/; +# Postload these action types +our @POSTLOAD = qw/Index Default/; + =head1 NAME Catalyst::Dispatcher - The Catalyst Dispatcher @@ -249,7 +253,7 @@ sub prepare_action { sub get_action { my ( $self, $c, $action, $namespace, $inherit ) = @_; return [] unless $action; - $namespace ||= '/'; + $namespace ||= ''; $inherit ||= 0; my @match = $self->get_containers($namespace); @@ -258,7 +262,19 @@ sub get_action { foreach my $child ( $inherit ? @match : $match[-1] ) { my $node = $child->actions; - push( @results, [ $node->{$action} ] ) if defined $node->{$action}; + if ( defined $node->{$action} ) { + unless ($inherit) { + $namespace = '' if $namespace eq '/'; + my $reverse = $node->{$action}->reverse; + my $name = $namespace + ? $namespace =~ /\/$/ + ? "$namespace$action" + : "$namespace/$action" + : $action; + last unless $name eq $reverse; + } + push( @results, [ $node->{$action} ] ); + } } return \@results; } @@ -455,8 +471,14 @@ sub setup_actions { } } - # Default actions are always last in the chain - push @{ $self->dispatch_types }, Catalyst::DispatchType::Default->new; + # Postload action types + for my $type (@POSTLOAD) { + my $class = "Catalyst::DispatchType::$type"; + eval "require $class"; + Catalyst::Exception->throw( message => qq/Couldn't load "$class"/ ) + if $@; + push @{ $self->dispatch_types }, $class->new; + } return unless $class->debug;