allow uri_for_action to be called with captures and args in a single arrayref
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
index 2d828b1..615472a 100644 (file)
@@ -84,7 +84,7 @@ __PACKAGE__->stats_class('Catalyst::Stats');
 
 # Remember to update this in Catalyst::Runtime as well!
 
-our $VERSION = '5.90002';
+our $VERSION = '5.90004';
 
 sub import {
     my ( $class, @arguments ) = @_;
@@ -1347,7 +1347,15 @@ sub uri_for {
         }
 
         my $action = $path;
-        $path = $c->dispatcher->uri_for_action($action, $captures);
+        # ->uri_for( $action, \@captures_and_args, \%query_values? )
+        if( !@args && $action->number_of_args ) {
+            my $expanded_action = $c->dispatcher->expand_action( $action );
+
+            my $num_captures = $expanded_action->number_of_captures;
+            unshift @args, splice @$captures, $num_captures;
+        }
+
+       $path = $c->dispatcher->uri_for_action($action, $captures);
         if (not defined $path) {
             $c->log->debug(qq/Can't find uri_for action '$action' @$captures/)
                 if $c->debug;
@@ -1863,9 +1871,17 @@ sub finalize_headers {
 
         if ( !$response->has_body ) {
             # Add a default body if none is already present
-            $response->body(
-                qq{<html><body><p>This item has moved <a href="$location">here</a>.</p></body></html>}
-            );
+            $response->body(<<"EOF");
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"> 
+  <head>
+    <title>Moved</title>
+  </head>
+  <body>
+     <p>This item has moved <a href="$location">here</a>.</p>
+  </body>
+</html>
+EOF
             $response->content_type('text/html; charset=utf-8');
         }
     }
@@ -1977,7 +1993,7 @@ sub handle_request {
     return $status;
 }
 
-=head2 $c->prepare( @arguments )
+=head2 $class->prepare( @arguments )
 
 Creates a Catalyst context from an engine-specific request (Apache, CGI,
 etc.).
@@ -2611,17 +2627,32 @@ sub engine_class {
             Catalyst::EngineLoader->new({
                 application_name => $class,
                 (defined $requested_engine
-                     ? (requested_engine => $requested_engine) : ()),
+                     ? (catalyst_engine_class => $requested_engine) : ()),
             }),
         );
     }
+
     $class->engine_loader->catalyst_engine_class;
 }
 
 sub setup_engine {
     my ($class, $requested_engine) = @_;
 
-    my $engine = $class->engine_class($requested_engine);
+    my $engine = do {
+        my $loader = $class->engine_loader;
+
+        if (!$loader || $requested_engine) {
+            $loader = Catalyst::EngineLoader->new({
+                application_name => $class,
+                (defined $requested_engine
+                     ? (requested_engine => $requested_engine) : ()),
+            }),
+
+            $class->engine_loader($loader);
+        }
+
+        $loader->catalyst_engine_class;
+    };
 
     # Don't really setup_engine -- see _setup_psgi_app for explanation.
     return if $class->loading_psgi_file;