use Catalyst::Request;
use Catalyst::Request::Upload;
use Catalyst::Response;
+use Catalyst::Utils;
require Module::Pluggable::Fast;
eval {
if ( $c->debug )
{
- my ( $elapsed, @state ) =
- $c->benchmark( $code, $class, $c, @{ $c->req->args } );
+ my ( $elapsed, @state ) = $c->benchmark( $code, $class, $c, @{ $c->req->args } );
push @{ $c->{stats} }, [ $action, sprintf( '%fs', $elapsed ) ];
$c->state(@state);
}
- else { $c->state( &$code( $class, $c, @{ $c->req->args } ) ) }
+ else { $c->state( &$code( $class, $c, @{ $c->req->args } ) || 0 ) }
};
if ( my $error = $@ ) {
if ( $#{ $c->error } >= 0 ) {
$c->finalize_error;
}
-
- if ( !$c->response->body && $c->response->status !~ /^(1|3)\d\d$/ ) {
+
+ if ( !$c->response->body && $c->response->status == 200 ) {
$c->finalize_error;
}
if ( $c->response->body && !$c->response->content_length ) {
- use bytes; # play safe with a utf8 aware perl
- $c->response->content_length( length $c->response->body );
+ $c->response->content_length( bytes::length( $c->response->body ) );
+ }
+
+ if ( $c->response->status =~ /^(1\d\d|[23]04)$/ ) {
+ $c->response->headers->remove_header("Content-Length");
+ $c->response->body('');
+ }
+
+ if ( $c->request->method eq 'HEAD' ) {
+ $c->response->body('');
}
my $status = $c->finalize_headers;
{
body => '',
cookies => {},
- headers => HTTP::Headers->new,
+ headers => HTTP::Headers->new( 'Content-Length' => 0 ),
status => 200
}
),
sub setup {
my $self = shift;
+
+ # Initialize our data structure
+ $self->components( {} );
+
$self->setup_components;
+
+ if ( $self->debug ) {
+ my $t = Text::ASCIITable->new;
+ $t->setOptions( 'hide_HeadRow', 1 );
+ $t->setOptions( 'hide_HeadLine', 1 );
+ $t->setCols('Class');
+ $t->setColWidth( 'Class', 75, 1 );
+ $t->addRow($_) for sort keys %{ $self->components };
+ $self->log->debug( 'Loaded components', $t->draw )
+ if ( @{ $t->{tbl_rows} } );
+ }
+
+ # Add our self to components, since we are also a component
+ $self->components->{ $self } = $self;
+
+ $self->setup_actions;
+
if ( $self->debug ) {
my $name = $self->config->{name} || 'Application';
$self->log->info("$name powered by Catalyst $Catalyst::VERSION");
sub setup_components {
my $self = shift;
- # Components
- my $class = ref $self || $self;
- eval <<"";
- package $class;
- import Module::Pluggable::Fast
- name => '_components',
- search => [
- '$class\::Controller', '$class\::C',
- '$class\::Model', '$class\::M',
- '$class\::View', '$class\::V'
- ];
+ my $callback = sub {
+ my ( $component, $context ) = @_;
+
+ unless ( $component->isa('Catalyst::Base') ) {
+ return $component;
+ }
+
+ my $suffix = Catalyst::Utils::class2classsuffix($component);
+ my $config = $self->config->{$suffix} || {};
+
+ my $instance;
+
+ eval {
+ $instance = $component->new( $context, $config );
+ };
+
+ if ( my $error = $@ ) {
+ chomp $error;
+ die qq/Couldn't instantiate component "$component", "$error"/;
+ }
+
+ return $instance;
+ };
+
+ eval {
+ Module::Pluggable::Fast->import(
+ name => '_components',
+ search => [
+ "$self\::Controller", "$self\::C",
+ "$self\::Model", "$self\::M",
+ "$self\::View", "$self\::V"
+ ],
+ callback => $callback
+ );
+ };
if ( my $error = $@ ) {
chomp $error;
die qq/Couldn't load components "$error"/;
}
- $self->components( {} );
- my @comps;
- for my $comp ( $self->_components($self) ) {
- $self->components->{ ref $comp } = $comp;
- push @comps, $comp;
+ for my $component ( $self->_components($self) ) {
+ $self->components->{ ref $component || $component } = $component;
}
-
- my $t = Text::ASCIITable->new( { hide_HeadRow => 1, hide_HeadLine => 1 } );
- $t->setCols('Class');
- $t->setColWidth( 'Class', 75, 1 );
- $t->addRow($_) for sort keys %{ $self->components };
- $self->log->debug( 'Loaded components', $t->draw )
- if ( @{ $t->{tbl_rows} } && $self->debug );
-
- $self->setup_actions( [ $self, @comps ] );
}
=item $c->state