cleaned up stash interface
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Response.pm
index efd0182..4d0e85a 100644 (file)
@@ -9,7 +9,7 @@ with 'MooseX::Emulate::Class::Accessor::Fast';
 
 has _response_cb => (
     is      => 'ro',
-    isa     => 'CodeRef',
+    isa     => 'CodeRef', 
     writer  => '_set_response_cb',
     clearer => '_clear_response_cb',
     predicate => '_has_response_cb',
@@ -20,12 +20,30 @@ subtype 'Catalyst::Engine::Types::Writer',
 
 has _writer => (
     is      => 'ro',
-    isa     => 'Catalyst::Engine::Types::Writer',
-    writer  => '_set_writer',
+    isa     => 'Catalyst::Engine::Types::Writer', #Pointless since we control how this is built
+    #writer  => '_set_writer', Now that its lazy I think this is safe to remove
     clearer => '_clear_writer',
     predicate => '_has_writer',
+    lazy      => 1,
+    builder => '_build_writer',
 );
 
+sub _build_writer {
+    my $self = shift;
+
+    ## These two lines are probably crap now...
+    $self->_context->finalize_headers unless
+      $self->finalized_headers;
+
+    my @headers;
+    $self->headers->scan(sub { push @headers, @_ });
+
+    my $writer = $self->_response_cb->([ $self->status, \@headers ]);
+    $self->_clear_response_cb;
+
+    return $writer;
+}
+
 has write_fh => (
   is=>'ro',
   predicate=>'_has_write_fh',
@@ -33,12 +51,7 @@ has write_fh => (
   builder=>'_build_write_fh',
 );
 
-sub _build_write_fh {
-  my $self = shift;
-  $self->_context->finalize_headers unless
-    $self->finalized_headers;
-  $self->_writer;
-};
+sub _build_write_fh { shift ->_writer }
 
 sub DEMOLISH {
   my $self = shift;
@@ -69,6 +82,15 @@ has _context => (
   clearer => '_clear_context',
 );
 
+before [qw(status headers content_encoding content_length content_type header)] => sub {
+  my $self = shift;
+
+  $self->_context->log->warn( 
+    "Useless setting a header value after finalize_headers called." .
+    " Not what you want." )
+      if ( $self->finalized_headers && @_ );
+};
+
 sub output { shift->body(@_) }
 
 sub code   { shift->status(@_) }
@@ -89,26 +111,6 @@ sub write {
 
 sub finalize_headers {
     my ($self) = @_;
-
-    # This is a less-than-pretty hack to avoid breaking the old
-    # Catalyst::Engine::PSGI. 5.9 Catalyst::Engine sets a response_cb and
-    # expects us to pass headers to it here, whereas Catalyst::Enngine::PSGI
-    # just pulls the headers out of $ctx->response in its run method and never
-    # sets response_cb. So take the lack of a response_cb as a sign that we
-    # don't need to set the headers.
-
-    return unless $self->_has_response_cb;
-
-    # If we already have a writer, we already did this, so don't do it again
-    return if $self->_has_writer;
-
-    my @headers;
-    $self->headers->scan(sub { push @headers, @_ });
-
-    my $writer = $self->_response_cb->([ $self->status, \@headers ]);
-    $self->_set_writer($writer);
-    $self->_clear_response_cb;
-
     return;
 }
 
@@ -118,23 +120,15 @@ sub from_psgi_response {
         my ($status, $headers, $body) = @$psgi_res;
         $self->status($status);
         $self->headers(HTTP::Headers->new(@$headers));
-        if(ref $body eq 'ARRAY') {
-          $self->body(join '', grep defined, @$body);
-        } else {
-          $self->body($body);
-        }
+        $self->body($body);
     } elsif(ref $psgi_res eq 'CODE') {
         $psgi_res->(sub {
             my $response = shift;
             my ($status, $headers, $maybe_body) = @$response;
             $self->status($status);
             $self->headers(HTTP::Headers->new(@$headers));
-            if($maybe_body) {
-                if(ref $maybe_body eq 'ARRAY') {
-                  $self->body(join '', grep defined, @$maybe_body);
-                } else {
-                  $self->body($maybe_body);
-                }
+            if(defined $maybe_body) {
+                $self->body($maybe_body);
             } else {
                 return $self->write_fh;
             }
@@ -186,7 +180,7 @@ already set in the response headers Catalyst will make a reasonable attempt
 to determine the size of the Handle. Depending on the implementation of your
 handle object, setting the content length may fail. If it is at all possible
 for you to determine the content length of your handle object, 
-it is recomended that you set the content length in the response headers
+it is recommended that you set the content length in the response headers
 yourself, which will be respected and sent by Catalyst in the response.
 
 =head2 $res->has_body