X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FDispatcher.pm;h=32a60a0a8c38e573a5746feafa336fef500cf8cd;hb=22f3a8dd32e5940d87a1d21642fa39c7813bc921;hp=36493ec4c9356398fdea1dae303c140d264740af;hpb=b96f127f47d826a5bb8ebebc80f1b46ab3497e39;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Dispatcher.pm b/lib/Catalyst/Dispatcher.pm index 36493ec..32a60a0 100644 --- a/lib/Catalyst/Dispatcher.pm +++ b/lib/Catalyst/Dispatcher.pm @@ -6,6 +6,7 @@ use Catalyst::Exception; use Catalyst::Utils; use Catalyst::Action; use Catalyst::ActionContainer; +use Catalyst::DispatchType::Path; use Catalyst::DispatchType::Regex; use Catalyst::DispatchType::Default; use Text::ASCIITable; @@ -175,6 +176,7 @@ qq/Couldn't forward to command "$command". Invalid action or component./; if ( my $code = $c->components->{$class}->can($method) ) { my $action = Catalyst::Action->new( { + name => $method, code => $code, reverse => "$class->$method", namespace => $class, @@ -218,39 +220,15 @@ sub prepare_action { DESCEND: while (@path) { $path = join '/', @path; - if ( my $result = ${ $c->get_action($path) }[0] ) { - - # It's a regex - if ($#$result) { - my $match = $result->[1]; - my @snippets = @{ $result->[2] }; - $c->log->debug( - qq/Requested action is "$path" and matched "$match"/) - if $c->debug; - $c->log->debug( - 'Snippets are "' . join( ' ', @snippets ) . '"' ) - if ( $c->debug && @snippets ); - $c->req->action($match); - $c->req->snippets( \@snippets ); - } - else { - $c->req->action($path); - $c->log->debug(qq/Requested action is "$path"/) if $c->debug; - } + # Check out dispatch types to see if any will handle the path at + # this level - $c->req->match($path); - $c->action($result->[0]); - $c->namespace($result->[0]->prefix); - last DESCEND; + foreach my $type (@{$self->dispatch_types}) { + last DESCEND if $type->prepare_action($c, $path); } - unless ( $c->action ) { - foreach my $type (@{$self->dispatch_types}) { - last DESCEND if $type->prepare_action($c, $path); - #last DESCEND if $c->action; - } - } + # If not, move the last part path to args unshift @args, pop @path; } @@ -282,22 +260,6 @@ sub get_action { return \@results; } - elsif ( my $p = $self->actions->{plain}->{$action} ) { return [ [$p] ] } - #elsif ( my $r = $self->actions->{regex}->{$action} ) { return [ [$r] ] } - - #else { - - # for my $i ( 0 .. $#{ $self->actions->{compiled} } ) { - # my $name = $self->actions->{compiled}->[$i]->[0]; - # my $regex = $self->actions->{compiled}->[$i]->[1]; - - # if ( my @snippets = ( $action =~ $regex ) ) { - # return [ - # [ $self->actions->{regex}->{$name}, $name, \@snippets ] ]; - # } - - # } - #} return []; } @@ -352,19 +314,12 @@ sub set_action { my $prefix = Catalyst::Utils::class2prefix( $namespace, $c->config->{case_sensitive} ) || ''; - my %flags; my %attributes; for my $attr ( @{$attrs} ) { - if ( $attr =~ /^(Local|Relative)$/ ) { $flags{local}++ } - elsif ( $attr =~ /^(Global|Absolute)$/ ) { $flags{global}++ } - elsif ( $attr =~ /^Path\(\s*(.+)\s*\)$/i ) { - push @{ $flags{path} }, $1; - } - elsif ( $attr =~ /^Private$/i ) { $flags{private}++ } - elsif ( $attr =~ /^(Regex|Regexp)\(\s*(.+)\s*\)$/i ) { - push @{ $flags{regex} }, $2; - } + + # Parse out :Foo(bar) into Foo => bar etc (and arrayify) + if ( my ($key, $value) = ($attr =~ /^(.*?)(?:\(\s*(.+)\s*\))?$/) ) { if ( defined $value ) { ($value =~ s/^'(.*)'$/$1/) || ($value =~ s/^"(.*)"/$1/); @@ -373,14 +328,14 @@ sub set_action { } } - if ( $flags{private} && ( keys %flags > 1 ) ) { + if ( $attributes{Private} && ( keys %attributes > 1 ) ) { $c->log->debug( 'Bad action definition "' . join( ' ', @{$attrs} ) . qq/" for "$namespace->$method"/ ) if $c->debug; return; } - return unless keys %flags; + return unless keys %attributes; my $parent = $self->tree; my $visitor = Tree::Simple::Visitor::FindByPath->new; @@ -412,6 +367,7 @@ sub set_action { my $action = Catalyst::Action->new( { + name => $method, code => $code, reverse => $reverse, namespace => $namespace, @@ -423,44 +379,7 @@ sub set_action { # Set the method value $parent->getNodeValue->actions->{$method} = $action; - my @path; - for my $path ( @{ $flags{path} } ) { - $path =~ s/^\w+//; - $path =~ s/\w+$//; - if ( $path =~ /^\s*'(.*)'\s*$/ ) { $path = $1 } - if ( $path =~ /^\s*"(.*)"\s*$/ ) { $path = $1 } - push @path, $path; - } - $flags{path} = \@path; - - my @regex; - for my $regex ( @{ $flags{regex} } ) { - $regex =~ s/^\w+//; - $regex =~ s/\w+$//; - if ( $regex =~ /^\s*'(.*)'\s*$/ ) { $regex = $1 } - if ( $regex =~ /^\s*"(.*)"\s*$/ ) { $regex = $1 } - push @regex, $regex; - } - $flags{regex} = \@regex; - - if ( $flags{local} || $flags{global} ) { - push( @{ $flags{path} }, $prefix ? "/$prefix/$method" : "/$method" ) - if $flags{local}; - - push( @{ $flags{path} }, "/$method" ) if $flags{global}; - } - - for my $path ( @{ $flags{path} } ) { - if ( $path =~ /^\// ) { $path =~ s/^\/// } - else { $path = $prefix ? "$prefix/$path" : $path } - $self->actions->{plain}->{$path} = $action; - } - - for my $regex ( @{ $flags{regex} } ) { - push @{ $self->actions->{compiled} }, [ $regex, qr#$regex# ]; - $self->actions->{regex}->{$regex} = $action; - } - + # Pass the action to our dispatch types so they can register it if reqd. foreach my $type ( @{ $self->dispatch_types } ) { $type->register_action($c, $action); } @@ -485,7 +404,7 @@ sub setup_actions { $self->dispatch_types([ map { "Catalyst::DispatchType::$_"->new } - qw/Regex Default/ ]); + qw/Path Regex Default/ ]); # We use a tree my $container = Catalyst::ActionContainer->new(