added $c->prepare_input and $c->req->input
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine.pm
index 641cc6d..486bbf7 100644 (file)
@@ -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 ] );
 }
 
@@ -643,6 +678,9 @@ sub stash {
     return $self->{stash};
 }
 
+# Takes a coderef and returns an arrayref containing attributes
+sub _get_attrs { attributes::get( $_[0] ) || [] }
+
 =back
 
 =head1 AUTHOR