use utf8;
use Carp qw/croak/;
+BEGIN { require 5.008001; }
+
__PACKAGE__->mk_accessors(
qw/counter request response state action stack namespace stats/
);
__PACKAGE__->request_class('Catalyst::Request');
__PACKAGE__->response_class('Catalyst::Response');
-our $VERSION = '5.678';
+our $VERSION = '5.6902';
sub import {
my ( $class, @arguments ) = @_;
catalyst.pl MyApp
# add models, views, controllers
- script/myapp_create.pl model Database DBIC dbi:SQLite:/path/to/db
+ script/myapp_create.pl model Database DBIC::SchemaLoader dbi:SQLite:/path/to/db
script/myapp_create.pl view TT TT
script/myapp_create.pl controller Search
sub details : Regex('^product/(\w+)/details$') {
my ( $self, $c ) = @_;
# extract the (\w+) from the URI
- my $product = $c->req->snippets->[0];
+ my $product = $c->req->captures->[0];
}
See L<Catalyst::Manual::Intro> for additional information.
=head2 -Debug
-Enables debug output.
+Enables debug output. You can also force this setting from the system
+environment with CATALYST_DEBUG or <MYAPP>_DEBUG. The environment settings
+override the app, with <MYAPP>_DEBUG having highest priority.
=head2 -Engine
my $c = shift;
if (@_) {
my $stash = @_ > 1 ? {@_} : $_[0];
+ croak('stash takes a hash or hashref') unless ref $stash;
while ( my ( $key, $val ) = each %$stash ) {
$c->{stash}->{$key} = $val;
}
$c->model('Foo')->do_stuff;
If the name is omitted, it will look for a config setting 'default_model',
-or check if there is only one model, and forward to it if that's the case.
+or check if there is only one view, and return it if that's the case.
=cut
sub setup {
my ( $class, @arguments ) = @_;
+ $class->log->warn("Running setup twice is not a good idea.")
+ if ( $class->setup_finished );
+
unless ( $class->isa('Catalyst') ) {
Catalyst::Exception->throw(
}
if (@plugins) {
- my $t = Text::SimpleTable->new(76);
+ my $t = Text::SimpleTable->new(74);
$t->row($_) for @plugins;
$class->log->debug( "Loaded plugins:\n" . $t->draw );
}
$class->setup_components;
if ( $class->debug ) {
- my $t = Text::SimpleTable->new( [ 65, 'Class' ], [ 8, 'Type' ] );
+ my $t = Text::SimpleTable->new( [ 63, 'Class' ], [ 8, 'Type' ] );
for my $comp ( sort keys %{ $class->components } ) {
my $type = ref $class->components->{$comp} ? 'instance' : 'class';
$t->row( $comp, $type );
my $basepath = $base->path;
$basepath =~ s/\/$//;
$basepath .= '/';
- my $namespace = $c->namespace;
+ my $namespace = $c->namespace || '';
# massage namespace, empty if absolute path
- $namespace =~ s/^\///;
+ $namespace =~ s/^\/// if $namespace;
$namespace .= '/' if $namespace;
$path ||= '';
$namespace = '' if $path =~ /^\//;
text-align: left;
background-color: #ccc;
border: 1px solid #aaa;
- -moz-border-radius: 10px;
}
p, h1, h2 {
margin-left: 20px;
margin: 10px;
background-color: #fff;
border: 1px solid #aaa;
- -moz-border-radius: 10px;
}
h1 {
font-size: 0.9em;
sub dump_these {
my $c = shift;
- [ Request => $c->req ], [ Response => $c->res ], [ Stash => $c->stash ],;
+ [ Request => $c->req ],
+ [ Response => $c->res ],
+ [ Stash => $c->stash ],
+ [ Config => $c->config ];
}
=head2 $c->engine_class
# Allow engine to handle finalize flow (for POE)
if ( $c->engine->can('finalize') ) {
- $c->engine->finalize( $c );
+ $c->engine->finalize($c);
}
else {
$elapsed = sprintf '%f', $elapsed;
my $av = sprintf '%.3f',
( $elapsed == 0 ? '??' : ( 1 / $elapsed ) );
- my $t = Text::SimpleTable->new( [ 64, 'Action' ], [ 9, 'Time' ] );
+ my $t = Text::SimpleTable->new( [ 62, 'Action' ], [ 9, 'Time' ] );
$stats->traverse(
sub {
parameters => {},
query_parameters => {},
secure => 0,
- snippets => [],
+ captures => [],
uploads => {}
}
),
if ( $c->debug ) {
my $secs = time - $START || 1;
my $av = sprintf '%.3f', $COUNT / $secs;
- $c->log->debug('**********************************');
- $c->log->debug("* Request $COUNT ($av/s) [$$]");
- $c->log->debug('**********************************');
+ my $time = localtime time;
+ $c->log->info("*** Request $COUNT ($av/s) [$$] [$time] ***");
$c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION );
}
}
my $method = $c->req->method || '';
- my $path = $c->req->path || '';
+ my $path = $c->req->path || '/';
my $address = $c->req->address || '';
$c->log->debug(qq/"$method" request for "$path" from "$address"/)
$c->prepare_uploads;
if ( $c->debug && keys %{ $c->req->body_parameters } ) {
- my $t = Text::SimpleTable->new( [ 37, 'Key' ], [ 36, 'Value' ] );
+ my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ 36, 'Value' ] );
for my $key ( sort keys %{ $c->req->body_parameters } ) {
my $param = $c->req->body_parameters->{$key};
my $value = defined($param) ? $param : '';
$c->engine->prepare_query_parameters( $c, @_ );
if ( $c->debug && keys %{ $c->request->query_parameters } ) {
- my $t = Text::SimpleTable->new( [ 37, 'Key' ], [ 36, 'Value' ] );
+ my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ 36, 'Value' ] );
for my $key ( sort keys %{ $c->req->query_parameters } ) {
my $param = $c->req->query_parameters->{$key};
my $value = defined($param) ? $param : '';
if ( $c->debug && keys %{ $c->request->uploads } ) {
my $t = Text::SimpleTable->new(
- [ 12, 'Key' ],
- [ 28, 'Filename' ],
+ [ 12, 'Parameter' ],
+ [ 26, 'Filename' ],
[ 18, 'Type' ],
[ 9, 'Size' ]
);