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=7c5134be1463365e13358b65d4bc40e2f5804ae0;hp=e735cf0fca93b9f87cef8e5b8652eca6f29f0e23;hb=f3414019f472b55682ef3af53f761b6db7955887;hpb=ac5c933bdd463558e8d621507a53a7b247a9093e diff --git a/lib/Catalyst/Dispatcher.pm b/lib/Catalyst/Dispatcher.pm index e735cf0..7c5134b 100644 --- a/lib/Catalyst/Dispatcher.pm +++ b/lib/Catalyst/Dispatcher.pm @@ -14,25 +14,23 @@ use Tree::Simple; use Tree::Simple::Visitor::FindByPath; use Scalar::Util (); -# Stringify to class -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', default => sub { [] }, required => 1, lazy => 1); +has _registered_dispatch_types => (is => 'rw', default => sub { {} }, required => 1, lazy => 1); +has _method_action_class => (is => 'rw', default => 'Catalyst::Action'); +has _action_container_class => (is => 'rw', default => 'Catalyst::ActionContainer'); + +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; @@ -170,10 +168,11 @@ sub forward { no warnings 'recursion'; - #moose todo: reaching inside another object is bad - 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; } @@ -281,7 +280,6 @@ sub prepare_action { unshift @args, $arg; } - #Moose todo: This seems illegible, even if efficient. s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg for grep { defined } @{$req->captures||[]}; $c->log->debug( 'Path is "' . $req->match . '"' ) @@ -459,10 +457,6 @@ sub _find_or_create_namespace_node { sub setup_actions { my ( $self, $c ) = @_; - $self->_dispatch_types( [] ); - $self->_registered_dispatch_types( {} ); - $self->_method_action_class('Catalyst::Action'); - $self->_action_container_class('Catalyst::ActionContainer'); my @classes = $self->_load_dispatch_types( @{ $self->preload_dispatch_types } ); @@ -518,7 +512,7 @@ sub _load_dispatch_types { for my $type (@types) { my $class = ( $type =~ /^\+(.*)$/ ) ? $1 : "Catalyst::DispatchType::${type}"; - #eval "require $class"; + eval { Class::MOP::load_class($class) }; Catalyst::Exception->throw( message => qq/Couldn't load "$class"/ ) if $@; @@ -530,6 +524,7 @@ sub _load_dispatch_types { return @loaded; } +no Moose; __PACKAGE__->meta->make_immutable; =head2 meta