stash is now middleware
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
index 2a40bc5..8ad1b7d 100755 (executable)
@@ -47,13 +47,14 @@ use Plack::Middleware::HTTPExceptions;
 use Plack::Middleware::FixMissingBodyInRedirect;
 use Plack::Middleware::MethodOverride;
 use Plack::Middleware::RemoveRedundantBody;
+use Catalyst::Middleware::Stash;
 use Plack::Util;
 use Class::Load 'load_class';
 
 BEGIN { require 5.008003; }
 
 has stack => (is => 'ro', default => sub { [] });
-has stash => (is => 'rw', default => sub { {} });
+#has stash => (is => 'rw', default => sub { {} });
 has state => (is => 'rw', default => 0);
 has stats => (is => 'rw');
 has action => (is => 'rw');
@@ -494,7 +495,7 @@ Catalyst).
     # stash is automatically passed to the view for use in a template
     $c->forward( 'MyApp::View::TT' );
 
-=cut
+
 
 around stash => sub {
     my $orig = shift;
@@ -511,6 +512,20 @@ around stash => sub {
     return $stash;
 };
 
+=cut
+
+sub stash {
+  my $c = shift;
+  my $stash = Catalyst::Middleware::Stash->get($c->req->env);
+  if(@_) {
+    my $new_stash = @_ > 1 ? {@_} : $_[0];
+    croak('stash takes a hash or hashref') unless ref $new_stash;
+    foreach my $key ( keys %$new_stash ) {
+      $stash->{$key} = $new_stash->{$key};
+    }
+  }
+  return $stash;
+}
 
 =head2 $c->error
 
@@ -564,6 +579,14 @@ sub clear_errors {
     $c->error(0);
 }
 
+=head2 $c->has_errors
+
+Returns true if you have errors
+
+=cut
+
+sub has_errors { scalar(@{shift->error}) ? 1:0 }
+
 sub _comp_search_prefixes {
     my $c = shift;
     return map $c->components->{ $_ }, $c->_comp_names_search_prefixes(@_);
@@ -1741,6 +1764,12 @@ sub execute {
     if ( my $error = $@ ) {
         #rethow if this can be handled by middleware
         if(blessed $error && ($error->can('as_psgi') || $error->can('code'))) {
+            foreach my $err (@{$c->error}) {
+                $c->log->error($err);
+            }
+            $c->clear_errors;
+            $c->log->_flush if $c->log->can('_flush');
+
             $error->can('rethrow') ? $error->rethrow : croak $error;
         }
         if ( blessed($error) and $error->isa('Catalyst::Exception::Detach') ) {
@@ -1922,7 +1951,6 @@ sub finalize_error {
             # In the case where the error 'knows what it wants', becauses its PSGI
             # aware, just rethow and let middleware catch it
             $error->can('rethrow') ? $error->rethrow : croak $error;
-            croak $error;
         } else {
             $c->engine->finalize_error( $c, @_ )
         }
@@ -3115,6 +3143,7 @@ sub registered_middlewares {
     my $class = shift;
     if(my $middleware = $class->_psgi_middleware) {
         return (
+          Catalyst::Middleware::Stash->new,
           Plack::Middleware::HTTPExceptions->new,
           Plack::Middleware::RemoveRedundantBody->new,
           Plack::Middleware::FixMissingBodyInRedirect->new,
@@ -3196,7 +3225,8 @@ sub registered_data_handlers {
     if(my $data_handlers = $class->_data_handlers) {
         return %$data_handlers;
     } else {
-        die "You cannot call ->registered_data_handlers until data_handers has been setup";
+        $class->setup_data_handlers;
+        return $class->registered_data_handlers;
     }
 }