Added Catalyst::Utils
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine.pm
index 9971412..e4f22da 100644 (file)
@@ -1,8 +1,8 @@
 package Catalyst::Engine;
 
 use strict;
-use base
-  qw/Class::Data::Inheritable Class::Accessor::Fast Catalyst::Dispatcher/;
+use base qw/Class::Data::Inheritable Class::Accessor::Fast/;
+use attributes ();
 use UNIVERSAL::require;
 use CGI::Cookie;
 use Data::Dumper;
@@ -10,13 +10,13 @@ use HTML::Entities;
 use HTTP::Headers;
 use Time::HiRes qw/gettimeofday tv_interval/;
 use Text::ASCIITable;
-use Text::ASCIITable::Wrap 'wrap';
 use Catalyst::Request;
 use Catalyst::Request::Upload;
 use Catalyst::Response;
 
 require Module::Pluggable::Fast;
 
+# For pretty dumps
 $Data::Dumper::Terse = 1;
 
 __PACKAGE__->mk_classdata('components');
@@ -26,6 +26,7 @@ __PACKAGE__->mk_accessors(qw/request response state/);
 *req  = \&request;
 *res  = \&response;
 
+# For statistics
 our $COUNT = 1;
 our $START = time;
 
@@ -77,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
@@ -122,6 +126,7 @@ sub execute {
     $class = $c->comp($class) || $class;
     $c->state(0);
     my $callsub = ( caller(1) )[3];
+
     eval {
         if ( $c->debug )
         {
@@ -135,6 +140,7 @@ sub execute {
         }
         else { $c->state( &$code( $class, $c, @{ $c->req->args } ) ) }
     };
+
     if ( my $error = $@ ) {
 
         unless ( ref $error ) {
@@ -339,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);
@@ -355,18 +363,19 @@ sub handler {
             $t->setColWidth( 'Action', 64, 1 );
             $t->setColWidth( 'Time',   9,  1 );
 
-            for my $stat (@stats) {
-                $t->addRow( wrap( $stat->[0], 64 ), wrap( $stat->[1], 9 ) );
-            }
+            for my $stat (@stats) { $t->addRow( $stat->[0], $stat->[1] ) }
             $class->log->info( "Request took $elapsed" . "s ($av/s)",
                 $t->draw );
         }
         else { $status = &$handler }
+
     };
+
     if ( my $error = $@ ) {
         chomp $error;
         $class->log->error(qq/Caught exception in engine "$error"/);
     }
+
     $COUNT++;
     return $status;
 }
@@ -380,6 +389,7 @@ into a Catalyst context .
 
 sub prepare {
     my ( $class, $r ) = @_;
+
     my $c = bless {
         request => Catalyst::Request->new(
             {
@@ -397,6 +407,7 @@ sub prepare {
         stash => {},
         state => 0
     }, $class;
+
     if ( $c->debug ) {
         my $secs = time - $START || 1;
         my $av = sprintf '%.3f', $COUNT / $secs;
@@ -405,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,10 +441,11 @@ sub prepare {
         $t->setColWidth( 'Value', 36, 1 );
         for my $key ( keys %{ $c->req->params } ) {
             my $value = $c->req->params->{$key} || '';
-            $t->addRow( wrap( $key, 37 ), wrap( $value, 36 ) );
+            $t->addRow( $key, $value );
         }
         $c->log->debug( 'Parameters are', $t->draw );
     }
+
     $c->prepare_uploads;
     return $c;
 }
@@ -445,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] ) {
@@ -462,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 );
 }
@@ -515,6 +536,14 @@ Prepare parameters.
 
 =cut
 
+sub prepare_input { }
+
+=item $c->prepare_input
+
+Prepare message body.
+
+=cut
+
 sub prepare_parameters { }
 
 =item $c->prepare_path
@@ -605,15 +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 ] );
 }