new incarnation of the continuation plugin
Yuval Kogman [Fri, 21 Apr 2006 21:11:17 +0000 (21:11 +0000)]
lib/Catalyst.pm
lib/Catalyst/Dispatcher.pm

index 1026625..b655be3 100644 (file)
@@ -1198,6 +1198,23 @@ sub execute {
     return $c->state;
 }
 
+=head2 $c->_localize_fields( sub { }, \%keys );
+
+=cut
+
+sub _localize_fields {
+    my ( $c, $localized, $code ) = ( @_ );
+
+    my $request = delete $localized->{request} || {};
+    my $response = delete $localized->{response} || {};
+    
+    local @{ $c }{ keys %$localized } = values %$localized;
+    local @{ $c->request }{ keys %$request } = values %$request;
+    local @{ $c->response }{ keys %$response } = values %$response;
+
+    $code->();
+}
+
 =head2 $c->finalize
 
 Finalizes the request.
index 391fefc..e330047 100644 (file)
@@ -286,12 +286,23 @@ returns a named action from a given namespace.
 sub get_action {
     my ( $self, $name, $namespace ) = @_;
     return unless $name;
-    $namespace ||= '';
-    $namespace = '' if $namespace eq '/';
+
+    $namespace = join("/", grep { length } split '/', $namespace || "" );
 
     return $self->action_hash->{"$namespace/$name"};
 }
 
+=head2 $self->get_action_by_path( $path );
+
+returns the named action by it's full path.
+
+=cut
+
+sub get_action_by_path {
+    my ( $self, $path ) = @_;
+    $self->action_hash->{$path};
+}
+
 =head2 $self->get_actions( $c, $action, $namespace )
 
 =cut
@@ -299,8 +310,8 @@ sub get_action {
 sub get_actions {
     my ( $self, $c, $action, $namespace ) = @_;
     return [] unless $action;
-    $namespace ||= '';
-    $namespace = '' if $namespace eq '/';
+
+    $namespace = join("/", grep { length } split '/', $namespace || "" );
 
     my @match = $self->get_containers($namespace);