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=0818f8568ef765a5ffb4413841e7dfc445377418;hp=f8a3839cd7eadb4f395085f03acfffa56929039f;hb=6680c772eaa987eafdb32e9437fd2d649dc914d9;hpb=5fb67d522575fa73fb6e291dd6d2fce8a69bf9e3 diff --git a/lib/Catalyst/Dispatcher.pm b/lib/Catalyst/Dispatcher.pm index f8a3839..0818f85 100644 --- a/lib/Catalyst/Dispatcher.pm +++ b/lib/Catalyst/Dispatcher.pm @@ -18,21 +18,22 @@ use Scalar::Util (); use overload '""' => sub { return ref(shift) }, fallback => 1; +#do these belong as package vars or should we build these via a builder method? # Preload these action types our @PRELOAD = qw/Index Path Regex/; # Postload these action types our @POSTLOAD = qw/Default/; -has _tree => (is => 'rw'); -has _dispatch_types => (is => 'rw'); -has _registered_dispatch_types => (is => 'rw'); -has _method_action_class => (is => 'rw'); -has _action_container_class => (is => 'rw'); -has preload_dispatch_types => (is => 'rw', required => 1, lazy => 1, default => sub { [@PRELOAD] }); -has postload_dispatch_types => (is => 'rw', required => 1, lazy => 1, default => sub { [@POSTLOAD] }); -has _action_hash => (is => 'rw', required => 1, lazy => 1, default => sub { {} }); -has _container_hash => (is => 'rw', required => 1, lazy => 1, default => sub { {} }); +has _tree => (is => 'rw'); +has _dispatch_types => (is => 'rw'); +has _registered_dispatch_types => (is => 'rw'); +has _method_action_class => (is => 'rw'); +has _action_container_class => (is => 'rw'); +has preload_dispatch_types => (is => 'rw', required => 1, lazy => 1, default => sub { [@PRELOAD] }); +has postload_dispatch_types => (is => 'rw', required => 1, lazy => 1, default => sub { [@POSTLOAD] }); +has _action_hash => (is => 'rw', required => 1, lazy => 1, default => sub { {} }); +has _container_hash => (is => 'rw', required => 1, lazy => 1, default => sub { {} }); no Moose; @@ -51,7 +52,7 @@ application based on the attributes you set. =head1 METHODS -=head2 new +=head2 new Construct a new dispatcher. @@ -108,8 +109,8 @@ message about unknown resource sub dispatch { my ( $self, $c ) = @_; - if ( $c->action ) { - $c->forward( join( '/', '', $c->action->namespace, '_DISPATCH' ) ); + if ( my $action = $c->action ) { + $c->forward( join( '/', '', $action->namespace, '_DISPATCH' ) ); } else { @@ -170,9 +171,11 @@ sub forward { no warnings 'recursion'; - local $c->request->{arguments} = \@args; + my $orig_args = $c->request->arguments(); + $c->request->arguments(\@args); $action->dispatch( $c ); - + $c->request->arguments($orig_args); + return $c->state; } @@ -254,9 +257,10 @@ Find an dispatch type that matches $c->req->path, and set args from it. sub prepare_action { my ( $self, $c ) = @_; - my $path = $c->req->path; - my @path = split /\//, $c->req->path; - $c->req->args( \my @args ); + my $req = $c->req; + my $path = $req->path; + my @path = split /\//, $req->path; + $req->args( \my @args ); unshift( @path, '' ); # Root action @@ -279,10 +283,10 @@ sub prepare_action { unshift @args, $arg; } - s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg for grep { defined } @{$c->req->captures||[]}; + s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg for grep { defined } @{$req->captures||[]}; - $c->log->debug( 'Path is "' . $c->req->match . '"' ) - if ( $c->debug && $c->req->match ); + $c->log->debug( 'Path is "' . $req->match . '"' ) + if ( $c->debug && $req->match ); $c->log->debug( 'Arguments are "' . join( '/', @args ) . '"' ) if ( $c->debug && @args ); @@ -300,12 +304,12 @@ sub get_action { $namespace = join( "/", grep { length } split '/', $namespace || "" ); - return $self->_action_hash->{"$namespace/$name"}; + return $self->_action_hash->{"${namespace}/${name}"}; } -=head2 $self->get_action_by_path( $path ); +=head2 $self->get_action_by_path( $path ); -Returns the named action by its full path. +Returns the named action by its full path. =cut @@ -352,6 +356,7 @@ sub get_containers { return reverse grep { defined } @containers, $self->_container_hash->{''}; + #return (split '/', $namespace); # isnt this more clear? my @parts = split '/', $namespace; } @@ -390,12 +395,11 @@ sub register { my $registered = $self->_registered_dispatch_types; - my $priv = 0; + #my $priv = 0; #seems to be unused foreach my $key ( keys %{ $action->attributes } ) { next if $key eq 'Private'; my $class = "Catalyst::DispatchType::$key"; unless ( $registered->{$class} ) { - #eval "require $class"; #some error checking rethrowing here wouldn't hurt. eval { Class::MOP::load_class($class) }; push( @{ $self->_dispatch_types }, $class->new ) unless $@; @@ -527,6 +531,9 @@ sub _load_dispatch_types { return @loaded; } +no Moose; +__PACKAGE__->meta->make_immutable; + =head2 meta Provided by Moose