Added temporary workaround for debug memory leak in Text::ASCIITable
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine.pm
index f2bcba3..36b839b 100644 (file)
@@ -10,16 +10,12 @@ use HTML::Entities;
 use HTTP::Headers;
 use Time::HiRes qw/gettimeofday tv_interval/;
 use Text::ASCIITable;
+use Catalyst::Exception;
 use Catalyst::Request;
 use Catalyst::Request::Upload;
 use Catalyst::Response;
 use Catalyst::Utils;
 
-require Module::Pluggable::Fast;
-
-# For pretty dumps
-$Data::Dumper::Terse = 1;
-
 __PACKAGE__->mk_classdata('components');
 __PACKAGE__->mk_accessors(qw/counter depth request response state/);
 
@@ -287,7 +283,12 @@ sub finalize_error {
 
     my ( $title, $error, $infos );
     if ( $c->debug ) {
-        $error = join '<br/>', @{ $c->error };
+
+        # For pretty dumps
+        local $Data::Dumper::Terse = 1;
+        $error = join '',
+          map { '<code class="error">' . encode_entities($_) . '</code>' }
+          @{ $c->error };
         $error ||= 'No output';
         $title = $name = "$name on Catalyst $Catalyst::VERSION";
         my $req   = encode_entities Dumper $c->req;
@@ -363,6 +364,12 @@ sub finalize_error {
             margin: 4px;
             -moz-border-radius: 10px;
         }
+        code.error {
+            display: block;
+            margin: 1em 0;
+            overflow: auto;
+            white-space: pre;
+        }
     </style>
 </head>
 <body>
@@ -412,13 +419,14 @@ sub handler {
             my $av = sprintf '%.3f',
               ( $elapsed == 0 ? '??' : ( 1 / $elapsed ) );
             my $t = Text::ASCIITable->new;
+            undef $t->{tiedarr};    # work-around for a memory leak
             $t->setCols( 'Action', 'Time' );
             $t->setColWidth( 'Action', 64, 1 );
             $t->setColWidth( 'Time',   9,  1 );
 
             for my $stat (@stats) { $t->addRow( $stat->[0], $stat->[1] ) }
-            $class->log->info( "Request took $elapsed" . "s ($av/s)",
-                $t->draw );
+            $class->log->info(
+                "Request took ${elapsed}s ($av/s)\n" . $t->draw );
         }
         else { $status = &$handler }
 
@@ -512,6 +520,7 @@ sub prepare {
 
     if ( $c->debug && keys %{ $c->req->params } ) {
         my $t = Text::ASCIITable->new;
+        undef $t->{tiedarr};    # work-around for a memory leak
         $t->setCols( 'Key', 'Value' );
         $t->setColWidth( 'Key',   37, 1 );
         $t->setColWidth( 'Value', 36, 1 );
@@ -520,7 +529,7 @@ sub prepare {
             my $value = defined($param) ? $param : '';
             $t->addRow( $key, $value );
         }
-        $c->log->debug( 'Parameters are', $t->draw );
+        $c->log->debug( "Parameters are:\n" . $t->draw );
     }
 
     return $c;
@@ -670,97 +679,6 @@ Returns a C<Catalyst::Response> object.
 
     my $res = $c->res;
 
-=item $class->setup
-
-Setup.
-
-    MyApp->setup;
-
-=cut
-
-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");
-    }
-}
-
-=item $class->setup_components
-
-Setup components.
-
-=cut
-
-sub setup_components {
-    my $self = shift;
-
-    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"/;
-    }
-
-    for my $component ( $self->_components($self) ) {
-        $self->components->{ ref $component || $component } = $component;
-    }
-}
-
 =item $c->state
 
 Contains the return value of the last executed action.