X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst.pm;h=dd0d1ed8e827f5710399feba9e917364c396d33c;hb=596aaffea2f27d13f0725b72a5b9f79a826d285b;hp=b6196354fb4129f372f25f3f46ca9a9c0fabc5b3;hpb=88879e92d58519c320438f8440a68d1648f4c099;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index b619635..dd0d1ed 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -61,7 +61,7 @@ __PACKAGE__->response_class('Catalyst::Response'); # Remember to update this in Catalyst::Runtime as well! -our $VERSION = '5.7001'; +our $VERSION = '5.7006'; sub import { my ( $class, @arguments ) = @_; @@ -293,9 +293,13 @@ sub forward { my $c = shift; $c->dispatcher->forward( $c, @_ ) } =head2 $c->detach( $class, $method, [, \@arguments ] ) +=head2 $c->detach() + The same as C, but doesn't return to the previous action when processing is finished. +When called with no arguments it escapes the processing chain entirely. + =cut sub detach { my $c = shift; $c->dispatcher->detach( $c, @_ ) } @@ -497,8 +501,11 @@ Gets a L instance by name. $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 view, and return it if that's the case. +If the name is omitted, it will look for + - a model object in $c->stash{current_model_instance}, then + - a model name in $c->stash->{current_model}, then + - a config setting 'default_model', or + - check if there is only one model, and return it if that's the case. =cut @@ -507,8 +514,14 @@ sub model { return $c->_filter_component( $c->_comp_prefixes( $name, qw/Model M/ ), @args ) if $name; - return $c->component( $c->config->{default_model} ) - if $c->config->{default_model}; + if (ref $c) { + return $c->stash->{current_model_instance} + if $c->stash->{current_model_instance}; + return $c->model( $c->stash->{current_model} ) + if $c->stash->{current_model}; + return $c->model( $c->config->{default_model} ) + if $c->config->{default_model}; + } return $c->_filter_component( $c->_comp_singular(qw/Model M/), @args ); } @@ -531,9 +544,11 @@ Gets a L instance by name. $c->view('Foo')->do_stuff; -If the name is omitted, it will look for a config setting -'default_view', or check if there is only one view, and forward to it if -that's the case. +If the name is omitted, it will look for + - a view object in $c->stash{current_view_instance}, then + - a view name in $c->stash->{current_view}, then + - a config setting 'default_view', or + - check if there is only one view, and return it if that's the case. =cut @@ -542,8 +557,14 @@ sub view { return $c->_filter_component( $c->_comp_prefixes( $name, qw/View V/ ), @args ) if $name; - return $c->component( $c->config->{default_view} ) - if $c->config->{default_view}; + if (ref $c) { + return $c->stash->{current_view_instance} + if $c->stash->{current_view_instance}; + return $c->view( $c->stash->{current_view} ) + if $c->stash->{current_view}; + return $c->view( $c->config->{default_view} ) + if $c->config->{default_view}; + } return $c->_filter_component( $c->_comp_singular(qw/View V/) ); } @@ -796,6 +817,7 @@ You are running an old script! or (this will not overwrite existing files): catalyst.pl -scripts $class + EOF } @@ -805,7 +827,7 @@ EOF if (@plugins) { my $t = Text::SimpleTable->new(74); $t->row($_) for @plugins; - $class->log->debug( "Loaded plugins:\n" . $t->draw ); + $class->log->debug( "Loaded plugins:\n" . $t->draw . "\n" ); } my $dispatcher = $class->dispatcher; @@ -840,7 +862,7 @@ EOF my $type = ref $class->components->{$comp} ? 'instance' : 'class'; $t->row( $comp, $type ); } - $class->log->debug( "Loaded components:\n" . $t->draw ) + $class->log->debug( "Loaded components:\n" . $t->draw . "\n" ) if ( keys %{ $class->components } ); } @@ -889,6 +911,7 @@ sub uri_for { : [] ); $path = $c->dispatcher->uri_for_action($path, $captures); return undef unless defined($path); + $path = '/' if $path eq ''; } # massage namespace, empty if absolute path @@ -897,11 +920,13 @@ sub uri_for { $path ||= ''; $namespace = '' if $path =~ /^\//; $path =~ s/^\///; + $path =~ s/\?/%3F/g; my $params = ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} ); for my $value ( values %$params ) { + next unless defined $value; for ( ref $value eq 'ARRAY' ? @$value : $value ) { $_ = "$_"; utf8::encode( $_ ); @@ -909,7 +934,7 @@ sub uri_for { }; # join args with '/', or a blank string - my $args = ( scalar @args ? '/' . join( '/', @args ) : '' ); + my $args = ( scalar @args ? '/' . join( '/', map {s/\?/%3F/g; $_} @args ) : '' ); $args =~ s/^\/// unless $path; my $res = URI->new_abs( URI->new_abs( "$path$args", "$basepath$namespace" ), $base ) @@ -1013,7 +1038,7 @@ sub welcome_message {

Catalyst Logo

-

Welcome to the wonderful world of Catalyst. +

Welcome to the world of Catalyst. This MVC framework will make web development something you had never expected it to be: Fun, rewarding, and quick.

@@ -1021,9 +1046,13 @@ sub welcome_message {

That really depends on what you want to do. We do, however, provide you with a few starting points.

If you want to jump right into web development with Catalyst - you might want to check out the documentation.

-
perldoc Catalyst::Manual::Intro
-perldoc Catalyst::Manual::Tutorial
+                    you might want want to start with a tutorial.

+
perldoc Catalyst::Manual::Tutorial
+
+

Afterwards you can go on to check out a more complete look at our features.

+
+perldoc Catalyst::Manual::Intro
+				
 perldoc Catalyst::Manual

What to do next?

Next it's time to write an actual application. Use the @@ -1289,6 +1318,24 @@ sub finalize { $c->finalize_body; } + + if ($c->debug) { + my $elapsed = sprintf '%f', tv_interval($c->stats->getNodeValue); + my $av = sprintf '%.3f', ( $elapsed == 0 ? '??' : ( 1 / $elapsed ) ); + + my $t = Text::SimpleTable->new( [ 62, 'Action' ], [ 9, 'Time' ] ); + $c->stats->traverse( + sub { + my $action = shift; + my $stat = $action->getNodeValue; + $t->row( ( q{ } x $action->getDepth ) . $stat->{action} . $stat->{comment}, + $stat->{elapsed} || '??' ); + } + ); + + $c->log->info( + "Request took ${elapsed}s ($av/s)\n" . $t->draw . "\n" ); + } return $c->response->status; } @@ -1417,35 +1464,15 @@ sub handle_request { my $status = -1; eval { if ($class->debug) { - my $start = [gettimeofday]; - my $c = $class->prepare(@arguments); - $c->stats(Tree::Simple->new); - $c->dispatch; - $status = $c->finalize; - - my $elapsed = tv_interval $start; - $elapsed = sprintf '%f', $elapsed; - my $av = sprintf '%.3f', - ( $elapsed == 0 ? '??' : ( 1 / $elapsed ) ); - my $t = Text::SimpleTable->new( [ 62, 'Action' ], [ 9, 'Time' ] ); - - $c->stats->traverse( - sub { - my $action = shift; - my $stat = $action->getNodeValue; - $t->row( ( q{ } x $action->getDepth ) . $stat->{action} . $stat->{comment}, - $stat->{elapsed} || '??' ); - } - ); - - $class->log->info( - "Request took ${elapsed}s ($av/s)\n" . $t->draw ); - } - else { - my $c = $class->prepare(@arguments); - $c->dispatch; - $status = $c->finalize; + my $secs = time - $START || 1; + my $av = sprintf '%.3f', $COUNT / $secs; + my $time = localtime time; + $class->log->info("*** Request $COUNT ($av/s) [$$] [$time] ***"); } + + my $c = $class->prepare(@arguments); + $c->dispatch; + $status = $c->finalize; }; if ( my $error = $@ ) { @@ -1499,20 +1526,17 @@ sub prepare { } ); + if ( $c->debug ) { + $c->stats(Tree::Simple->new([gettimeofday])); + $c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION ); + } + # For on-demand data $c->request->{_context} = $c; $c->response->{_context} = $c; weaken( $c->request->{_context} ); weaken( $c->response->{_context} ); - if ( $c->debug ) { - my $secs = time - $START || 1; - my $av = sprintf '%.3f', $COUNT / $secs; - my $time = localtime time; - $c->log->info("*** Request $COUNT ($av/s) [$$] [$time] ***"); - $c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION ); - } - # Allow engine to direct the prepare flow (for POE) if ( $c->engine->can('prepare') ) { $c->engine->prepare( $c, @arguments );