X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst.pm;h=5294064bafe8faebc97a4a111ebbf56eb8d4294c;hb=e16a6c4e6c4d49e73b5286b3186616af14f3f554;hp=f726932958e94c12b7d4512d9c78d9cd31020970;hpb=108201b5c403a8db7f6fa7726110b1d1b1caac1b;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index f726932..5294064 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -49,6 +49,7 @@ our $COUNT = 1; our $START = time; our $RECURSION = 1000; our $DETACH = "catalyst_detach\n"; +our $GO = "catalyst_go\n"; __PACKAGE__->mk_classdata($_) for qw/components arguments dispatcher engine log dispatcher_class @@ -63,7 +64,7 @@ __PACKAGE__->stats_class('Catalyst::Stats'); # Remember to update this in Catalyst::Runtime as well! -our $VERSION = '5.7099_03'; +our $VERSION = '5.71000'; sub import { my ( $class, @arguments ) = @_; @@ -327,6 +328,47 @@ When called with no arguments it escapes the processing chain entirely. sub detach { my $c = shift; $c->dispatcher->detach( $c, @_ ) } +=head2 $c->visit( $action [, \@arguments ] ) + +=head2 $c->visit( $class, $method, [, \@arguments ] ) + +Almost the same as C, but does a full dispatch, instead of just +calling the new C<$action> / C<$class-E$method>. This means that C, +C and the method you go to are called, just like a new request. + +In addition both C<< $c->action >> and C<< $c->namespace >> are localized. +This means, for example, that $c->action methods such as C, C and +C return information for the visited action when they are invoked +within the visited action. This is different from the behavior of C +which continues to use the $c->action object from the caller action even when +invoked from the callee. + +C<$c-Estash> is kept unchanged. + +In effect, C allows you to "wrap" another action, just as it +would have been called by dispatching from a URL, while the analogous +C allows you to transfer control to another action as if it had +been reached directly from a URL. + +=cut + +sub visit { my $c = shift; $c->dispatcher->visit( $c, @_ ) } + +=head2 $c->go( $action [, \@arguments ] ) + +=head2 $c->go( $class, $method, [, \@arguments ] ) + +Almost the same as C, but does a full dispatch like C, +instead of just calling the new C<$action> / +C<$class-E$method>. This means that C, C and the +method you visit are called, just like a new request. + +C<$c-Estash> is kept unchanged. + +=cut + +sub go { my $c = shift; $c->dispatcher->go( $c, @_ ) } + =head2 $c->response =head2 $c->res @@ -914,7 +956,8 @@ EOF my @plugins = map { "$_ " . ( $_->VERSION || '' ) } $class->registered_plugins; if (@plugins) { - my $t = Text::SimpleTable->new(74); + my $column_width = Catalyst::Utils::term_width() - 6; + my $t = Text::SimpleTable->new($column_width); $t->row($_) for @plugins; $class->log->debug( "Loaded plugins:\n" . $t->draw . "\n" ); } @@ -946,7 +989,8 @@ EOF $class->setup_components; if ( $class->debug ) { - my $t = Text::SimpleTable->new( [ 63, 'Class' ], [ 8, 'Type' ] ); + my $column_width = Catalyst::Utils::term_width() - 8 - 9; + my $t = Text::SimpleTable->new( [ $column_width, 'Class' ], [ 8, 'Type' ] ); for my $comp ( sort keys %{ $class->components } ) { my $type = ref $class->components->{$comp} ? 'instance' : 'class'; $t->row( $comp, $type ); @@ -1339,6 +1383,9 @@ sub execute { if ( !ref($error) and $error eq $DETACH ) { die $DETACH if($c->depth > 1); } + elsif ( !ref($error) and $error eq $GO ) { + die $GO if($c->depth > 0); + } else { unless ( ref $error ) { no warnings 'uninitialized'; @@ -2544,6 +2591,8 @@ obra: Jesse Vincent omega: Andreas Marienborg +Oleg Kostyuk + phaylon: Robert Sedlacek sky: Arthur Bergman @@ -2554,6 +2603,8 @@ Ulf Edvinsson willert: Sebastian Willert +batman: Jan Henning Thorsen + =head1 LICENSE This library is free software, you can redistribute it and/or modify it under