Don't stringify blessed errors in ->execute
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine.pm
index b086559..a095811 100644 (file)
@@ -116,17 +116,34 @@ sub dispatch {
     my $results = $c->get_action( $action, $default );
     $namespace ||= '/';
     if ( @{$results} ) {
-        for my $begin ( @{ $c->get_action( 'begin', $namespace ) } ) {
-            $c->state( $c->execute( @{ $begin->[0] } ) );
+
+        # Execute last begin
+        $c->state(1);
+        if ( my $begin = @{ $c->get_action( 'begin', $namespace ) }[-1] ) {
+            $c->execute( @{ $begin->[0] } );
+            return if scalar @{$c->error};
+            last unless $c->state;
+        }
+
+        # Execute the auto chain
+        for my $auto ( @{ $c->get_action( 'auto', $namespace ) } ) {
+            $c->execute( @{ $auto->[0] } );
+            return if scalar @{$c->error};
+            last unless $c->state;
         }
-        if ( my $action = $c->req->action ) {
-            for my $result ( @{ $c->get_action( $action, $default ) }[-1] ) {
-                $c->state( $c->execute( @{ $result->[0] } ) );
-                last unless $default;
+
+        # Execute the action or last default
+        if ( ( my $action = $c->req->action ) && $c->state ) {
+            if ( my $result = @{ $c->get_action( $action, $default ) }[-1] ) {
+                $c->execute( @{ $result->[0] } );
             }
         }
-        for my $end ( reverse @{ $c->get_action( 'end', $namespace ) } ) {
-            $c->state( $c->execute( @{ $end->[0] } ) );
+
+        # Execute last end
+        if ( my $end = @{ $c->get_action( 'end', $namespace ) }[-1] ) {
+            $c->execute( @{ $end->[0] } );
+            return if scalar @{$c->error};
+            last unless $c->state;
         }
     }
     else {
@@ -188,10 +205,14 @@ sub execute {
         else { $c->state( &$code( $class, $c, @{ $c->req->args } ) ) }
     };
     if ( my $error = $@ ) {
-        chomp $error;
-        $error = qq/Caught exception "$error"/;
+
+        unless ( ref $error ) {
+            chomp $error;
+            $error = qq/Caught exception "$error"/;
+        }
+        
         $c->log->error($error);
-        $c->error($error) if $c->debug;
+        $c->error($error);
         $c->state(0);
     }
     return $c->state;
@@ -420,7 +441,7 @@ sub forward {
         }
     }
     for my $result ( @{$results} ) {
-        $c->state( $c->execute( @{ $result->[0] } ) );
+        $c->execute( @{ $result->[0] } );
     }
     return $c->state;
 }