package Catalyst::Response;
-use strict;
-use base 'Class::Accessor::Fast';
-
-__PACKAGE__->mk_accessors(qw/cookies body headers location status/);
-
-*output = \&body;
-
-sub content_encoding { shift->headers->content_encoding(@_) }
-sub content_length { shift->headers->content_length(@_) }
-sub content_type { shift->headers->content_type(@_) }
-sub header { shift->headers->header(@_) }
+use Moose;
+use HTTP::Headers;
+
+with 'MooseX::Emulate::Class::Accessor::Fast';
+
+has cookies => (is => 'rw', default => sub { {} });
+has body => (is => 'rw', default => '', lazy => 1, predicate => 'has_body');
+has location => (is => 'rw');
+has status => (is => 'rw', default => 200);
+has finalized_headers => (is => 'rw', default => 0);
+has headers => (
+ is => 'rw',
+ handles => [qw(content_encoding content_length content_type header)],
+ default => sub { HTTP::Headers->new() },
+ required => 1,
+ lazy => 1,
+);
+has _context => (
+ is => 'rw',
+ weak_ref => 1,
+ handles => ['write'],
+ clearer => '_clear_context',
+);
+
+sub output { shift->body(@_) }
+
+sub code { shift->status(@_) }
+
+no Moose;
=head1 NAME
$res = $c->response;
$res->body;
+ $res->code;
$res->content_encoding;
$res->content_length;
$res->content_type;
=head1 DESCRIPTION
This is the Catalyst Response class, which provides methods for responding to
-the current client request.
+the current client request. The appropriate L<Catalyst::Engine> for your environment
+will turn the Catalyst::Response into a HTTP Response and return it to the client.
=head1 METHODS
-=over 4
-
-=item $res->body($text)
+=head2 $res->body(<$text|$fh|$iohandle_object)
$c->response->body('Catalyst rocks!');
-Sets or returns the output (text or binary data).
+Sets or returns the output (text or binary data). If you are returning a large body,
+you might want to use a L<IO::Handle> type of object (Something that implements the read method
+in the same fashion), or a filehandle GLOB. Catalyst
+will write it piece by piece into the response.
+
+=head2 $res->has_body
+
+Predicate which returns true when a body has been set.
+
+=head2 $res->code
-=item $res->content_encoding
+Alias for $res->status.
+
+=head2 $res->content_encoding
Shortcut for $res->headers->content_encoding.
-=item $res->content_length
+=head2 $res->content_length
Shortcut for $res->headers->content_length.
-=item $res->content_type
+=head2 $res->content_type
Shortcut for $res->headers->content_type.
-=item $res->cookies
+This value is typically set by your view or plugin. For example,
+L<Catalyst::Plugin::Static::Simple> will guess the mime type based on the file
+it found, while L<Catalyst::View::TT> defaults to C<text/html>.
+
+=head2 $res->cookies
Returns a reference to a hash containing cookies to be set. The keys of the
hash are the cookies' names, and their corresponding values are hash
parameters of the same name, except they are used without a leading dash.
Possible parameters are:
-=over 4
+=over
=item value
=back
-=item $res->header
+=head2 $res->header
Shortcut for $res->headers->header.
-=item $res->headers
+=head2 $res->headers
Returns an L<HTTP::Headers> object, which can be used to set headers.
$c->response->headers->header( 'X-Catalyst' => $Catalyst::VERSION );
-=item $res->output
+=head2 $res->output
Alias for $res->body.
-=item $res->redirect( $url, $status )
+=head2 $res->redirect( $url, $status )
-Causes the response to redirect to the specified URL.
+Causes the response to redirect to the specified URL. The default status is
+C<302>.
$c->response->redirect( 'http://slashdot.org' );
$c->response->redirect( 'http://slashdot.org', 307 );
+This is a convenience method that sets the Location header to the
+redirect destination, and then sets the response status. You will
+want to C< return; > or C< $c->detach() > to interrupt the normal
+processing flow if you want the redirect to occur straight away.
+
=cut
sub redirect {
return $self->location;
}
-=item $res->status
+=head2 $res->location
+
+Sets or returns the HTTP 'Location'.
+
+=head2 $res->status
Sets or returns the HTTP status.
$c->response->status(404);
+
+$res->code is an alias for this, to match HTTP::Response->code.
-=item $res->write( $data )
+=head2 $res->write( $data )
Writes $data to the output stream.
+=head2 meta
+
+Provided by Moose
+
+=head2 $res->print( @data )
+
+Prints @data to the output stream, separated by $,. This lets you pass
+the response object to functions that want to write to an L<IO::Handle>.
+
=cut
-sub write { shift->{_context}->write(@_); }
+sub print {
+ my $self = shift;
+ my $data = shift;
-=back
+ defined $self->write($data) or return;
-=head1 AUTHORS
+ for (@_) {
+ defined $self->write($,) or return;
+ defined $self->write($_) or return;
+ }
+
+ return 1;
+}
-Sebastian Riedel, C<sri@cpan.org>
+=head1 AUTHORS
-Marcus Ramberg, C<mramberg@cpan.org>
+Catalyst Contributors, see Catalyst.pm
=head1 COPYRIGHT
=cut
+__PACKAGE__->meta->make_immutable;
+
1;