Move write and finalize_headers into response object
Tomas Doran [Mon, 31 Oct 2011 18:32:25 +0000 (18:32 +0000)]
lib/Catalyst.pm
lib/Catalyst/Engine.pm
lib/Catalyst/Response.pm

index 9f683bb..9e77f31 100644 (file)
@@ -2973,10 +2973,7 @@ your output data, if known.
 sub write {
     my $c = shift;
 
-    # Finalize headers if someone manually writes output
-    $c->finalize_headers;
-
-    return $c->engine->write( $c, @_ );
+    return $c->response->write( @_ );
 }
 
 =head2 version
index ce40740..67e4dab 100644 (file)
@@ -325,29 +325,14 @@ sub finalize_error {
 
 =head2 $self->finalize_headers($c)
 
-Abstract method, allows engines to write headers to response
+Allows engines to write headers to response
 
 =cut
 
 sub finalize_headers {
     my ($self, $ctx) = @_;
 
-    # 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 ($ctx->response->_has_response_cb);
-
-    my @headers;
-    $ctx->response->headers->scan(sub { push @headers, @_ });
-
-    my $writer = $ctx->response->_response_cb->([ $ctx->response->status, \@headers ]);
-    $ctx->response->_set_writer($writer);
-    $ctx->response->_clear_response_cb;
-
+    $ctx->response->finalize_headers;
     return;
 }
 
@@ -709,14 +694,7 @@ Writes the buffer to the client.
 sub write {
     my ( $self, $c, $buffer ) = @_;
 
-    my $response = $c->response;
-
-    $buffer = q[] unless defined $buffer;
-
-    my $len = length($buffer);
-    $c->res->_writer->write($buffer);
-
-    return $len;
+    $c->response->write($buffer);
 }
 
 =head2 $self->unescape_uri($uri)
index 5f49df7..185dc99 100644 (file)
@@ -46,7 +46,6 @@ has headers   => (
 has _context => (
   is => 'rw',
   weak_ref => 1,
-  handles => ['write'],
   clearer => '_clear_context',
 );
 
@@ -54,6 +53,57 @@ sub output { shift->body(@_) }
 
 sub code   { shift->status(@_) }
 
+=head2 $self->write($buffer)
+
+Writes the buffer to the client.
+
+=cut
+
+sub write {
+    my ( $self, $buffer ) = @_;
+
+    # Finalize headers if someone manually writes output
+    $self->finalize_headers;
+
+    $buffer = q[] unless defined $buffer;
+
+    my $len = length($buffer);
+    $self->_writer->write($buffer);
+
+    return $len;
+}
+
+=head2 $self->finalize_headers($c)
+
+Abstract method, allows engines to write headers to response
+
+=cut
+
+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;
+}
+
 =head1 NAME
 
 Catalyst::Response - stores output responding to the current client request