X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine.pm;h=e4f22da1a8bbbcd0c0c004d768d935c22abfd6ec;hb=f05af9ba770db5ada00fc0fb593560f39cc6b817;hp=641cc6d63ac6e0a0e684da3ec897635896a5ad8d;hpb=cd677e12b127597abb93b76560c8cb23a47d5da6;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine.pm b/lib/Catalyst/Engine.pm index 641cc6d..e4f22da 100644 --- a/lib/Catalyst/Engine.pm +++ b/lib/Catalyst/Engine.pm @@ -2,6 +2,7 @@ package Catalyst::Engine; use strict; use base qw/Class::Data::Inheritable Class::Accessor::Fast/; +use attributes (); use UNIVERSAL::require; use CGI::Cookie; use Data::Dumper; @@ -15,6 +16,7 @@ use Catalyst::Response; require Module::Pluggable::Fast; +# For pretty dumps $Data::Dumper::Terse = 1; __PACKAGE__->mk_classdata('components'); @@ -24,6 +26,7 @@ __PACKAGE__->mk_accessors(qw/request response state/); *req = \&request; *res = \&response; +# For statistics our $COUNT = 1; our $START = time; @@ -75,14 +78,17 @@ Regex search for a component. sub component { my ( $c, $name ) = @_; + if ( my $component = $c->components->{$name} ) { return $component; } + else { for my $component ( keys %{ $c->components } ) { return $c->components->{$component} if $component =~ /$name/i; } } + } =item $c->error @@ -120,6 +126,7 @@ sub execute { $class = $c->comp($class) || $class; $c->state(0); my $callsub = ( caller(1) )[3]; + eval { if ( $c->debug ) { @@ -133,6 +140,7 @@ sub execute { } else { $c->state( &$code( $class, $c, @{ $c->req->args } ) ) } }; + if ( my $error = $@ ) { unless ( ref $error ) { @@ -337,12 +345,14 @@ sub handler { my $status = -1; eval { my @stats = (); + my $handler = sub { my $c = $class->prepare($engine); $c->{stats} = \@stats; $c->dispatch; return $c->finalize; }; + if ( $class->debug ) { my $elapsed; ( $elapsed, $status ) = $class->benchmark($handler); @@ -358,11 +368,14 @@ sub handler { $t->draw ); } else { $status = &$handler } + }; + if ( my $error = $@ ) { chomp $error; $class->log->error(qq/Caught exception in engine "$error"/); } + $COUNT++; return $status; } @@ -376,6 +389,7 @@ into a Catalyst context . sub prepare { my ( $class, $r ) = @_; + my $c = bless { request => Catalyst::Request->new( { @@ -393,6 +407,7 @@ sub prepare { stash => {}, state => 0 }, $class; + if ( $c->debug ) { my $secs = time - $START || 1; my $av = sprintf '%.3f', $COUNT / $secs; @@ -401,17 +416,21 @@ sub prepare { $c->log->debug('**********************************'); $c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION ); } + $c->prepare_request($r); $c->prepare_path; $c->prepare_headers; + $c->prepare_input; $c->prepare_cookies; $c->prepare_connection; + my $method = $c->req->method || ''; my $path = $c->req->path || ''; my $hostname = $c->req->hostname || ''; my $address = $c->req->address || ''; $c->log->debug(qq/"$method" request for "$path" from $hostname($address)/) if $c->debug; + $c->prepare_action; $c->prepare_parameters; @@ -426,6 +445,7 @@ sub prepare { } $c->log->debug( 'Parameters are', $t->draw ); } + $c->prepare_uploads; return $c; } @@ -441,6 +461,7 @@ sub prepare_action { my $path = $c->req->path; my @path = split /\//, $c->req->path; $c->req->args( \my @args ); + while (@path) { $path = join '/', @path; if ( my $result = ${ $c->get_action($path) }[0] ) { @@ -458,19 +479,23 @@ sub prepare_action { $c->req->action($match); $c->req->snippets( \@snippets ); } + else { $c->req->action($path); $c->log->debug(qq/Requested action is "$path"/) if $c->debug; } + $c->req->match($path); last; } unshift @args, pop @path; } + unless ( $c->req->action ) { $c->req->action('default'); $c->req->match(''); } + $c->log->debug( 'Arguments are "' . join( '/', @args ) . '"' ) if ( $c->debug && @args ); } @@ -511,6 +536,14 @@ Prepare parameters. =cut +sub prepare_input { } + +=item $c->prepare_input + +Prepare message body. + +=cut + sub prepare_parameters { } =item $c->prepare_path @@ -601,21 +634,23 @@ sub setup_components { if ( my $error = $@ ) { chomp $error; - $self->log->error( - qq/Couldn't initialize "Module::Pluggable::Fast", "$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; } + my $t = Text::ASCIITable->new( { hide_HeadRow => 1, hide_HeadLine => 1 } ); $t->setCols('Class'); $t->setColWidth( 'Class', 75, 1 ); $t->addRow($_) for keys %{ $self->components }; $self->log->debug( 'Loaded components', $t->draw ) if ( @{ $t->{tbl_rows} } && $self->debug ); + $self->setup_actions( [ $self, @comps ] ); }