diff -bBurN Catalyst-Runtime-5.7099_03/MANIFEST Catalyst-Runtime-bailey/MANIFEST
--- Catalyst-Runtime-5.7099_03/MANIFEST	2008-07-20 04:14:01.000000000 -0400
+++ Catalyst-Runtime-bailey/MANIFEST	2008-08-12 01:03:49.000000000 -0400
@@ -106,6 +106,9 @@
 t/lib/TestApp/Controller/Action/Streaming.pm
 t/lib/TestApp/Controller/Action/TestMultipath.pm
 t/lib/TestApp/Controller/Action/TestRelative.pm
+t/lib/TestApp/Controller/Action/Visit.pm
+t/lib/TestApp/Controller/Action/Visitee.pm
+t/lib/TestApp/Controller/Action/Visitoo.pm
 t/lib/TestApp/Controller/Args.pm
 t/lib/TestApp/Controller/Dump.pm
 t/lib/TestApp/Controller/Engine/Request/Uploads.pm
@@ -159,6 +162,7 @@
 t/live_component_controller_action_private.t
 t/live_component_controller_action_regexp.t
 t/live_component_controller_action_streaming.t
+t/live_component_controller_action_visit.t
 t/live_component_controller_args.t
 t/live_engine_request_auth.t
 t/live_engine_request_body.t
diff -bBurN Catalyst-Runtime-5.7099_03/lib/Catalyst/Dispatcher.pm Catalyst-Runtime-bailey/lib/Catalyst/Dispatcher.pm
--- Catalyst-Runtime-5.7099_03/lib/Catalyst/Dispatcher.pm	2008-07-16 13:19:54.000000000 -0400
+++ Catalyst-Runtime-bailey/lib/Catalyst/Dispatcher.pm	2008-08-12 01:17:17.000000000 -0400
@@ -165,13 +165,13 @@
     return $action, \@args;
 }
 
-=head2 $self->go( $c, $command [, \@arguments ] )
+=head2 $self->visit( $c, $command [, \@arguments ] )
 
 Documented in L<Catalyst>
 
 =cut
 
-sub go {
+sub visit {
     my $self = shift;
     my ( $c, $command ) = @_;
     my ( $action, $args ) = $self->_command2action(@_);
@@ -189,7 +189,17 @@
     $c->namespace($action->namespace);
     $c->action($action);
     $self->dispatch($c);
+}
 
+=head2 $self->go( $c, $command [, \@arguments ] )
+
+Documented in L<Catalyst>
+
+=cut
+
+sub go {
+    my $self = shift;
+    $self->visit(@_);
     die $Catalyst::GO;
 }
 
diff -bBurN Catalyst-Runtime-5.7099_03/lib/Catalyst.pm Catalyst-Runtime-bailey/lib/Catalyst.pm
--- Catalyst-Runtime-5.7099_03/lib/Catalyst.pm	2008-07-20 04:09:54.000000000 -0400
+++ Catalyst-Runtime-bailey/lib/Catalyst.pm	2008-08-12 01:01:50.000000000 -0400
@@ -328,13 +328,33 @@
 
 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<forward>, but does a full dispatch, instead of just
+calling the new C<$action> / C<$class-E<gt>$method>. This means that C<begin>,
+C<auto> and the method you go to are called, just like a new request.
+
+C<$c-E<gt>stash> is kept unchanged.
+
+In effect, C<visit> allows you to "wrap" another action, just as it
+would have been called by dispatching from a URL, while the analogous
+C<go> 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<detach>, but does a full dispatch, instead of just
-calling the new C<$action> / C<$class-E<gt>$method>. This means that C<begin>,
-C<auto> and the method you go to is called, just like a new request.
+Almost the same as C<detach>, but does a full dispatch like C<visit>,
+instead of just calling the new C<$action> /
+C<$class-E<gt>$method>. This means that C<begin>, C<auto> and the
+method you visit are called, just like a new request.
 
 C<$c-E<gt>stash> is kept unchanged.
 
diff -bBurN Catalyst-Runtime-5.7099_03/t/lib/TestApp/Controller/Action/TestRelative.pm Catalyst-Runtime-bailey/t/lib/TestApp/Controller/Action/TestRelative.pm
--- Catalyst-Runtime-5.7099_03/t/lib/TestApp/Controller/Action/TestRelative.pm	2008-06-27 05:17:35.000000000 -0400
+++ Catalyst-Runtime-bailey/t/lib/TestApp/Controller/Action/TestRelative.pm	2008-08-04 18:47:32.000000000 -0400
@@ -26,4 +26,15 @@
     my ( $self, $c ) = @_;
     $c->go( 'TestApp::Controller::Action::Go', 'one' );
 }
+
+sub relative_visit : Local {
+    my ( $self, $c ) = @_;
+    $c->visit('/action/visit/one');
+}
+
+sub relative_visit_two : Local {
+    my ( $self, $c ) = @_;
+    $c->visit( 'TestApp::Controller::Action::Visit', 'one' );
+}
+
 1;
diff -bBurN Catalyst-Runtime-5.7099_03/t/lib/TestApp/Controller/Action/Visit.pm Catalyst-Runtime-bailey/t/lib/TestApp/Controller/Action/Visit.pm
--- Catalyst-Runtime-5.7099_03/t/lib/TestApp/Controller/Action/Visit.pm	1969-12-31 19:00:00.000000000 -0500
+++ Catalyst-Runtime-bailey/t/lib/TestApp/Controller/Action/Visit.pm	2008-08-12 00:46:38.000000000 -0400
@@ -0,0 +1,65 @@
+package TestApp::Controller::Action::Visit;
+
+use strict;
+use base 'TestApp::Controller::Action';
+
+sub one : Local {
+    my ( $self, $c ) = @_;
+    $c->visit('two');
+}
+
+sub two : Private {
+    my ( $self, $c ) = @_;
+    $c->visit('TestApp::Controller::Action::Visitoo','three');
+}
+
+sub inheritance : Local {
+    my ( $self, $c ) = @_;
+    $c->visit('/action/inheritance/a/b/default');
+}
+
+sub global : Local {
+    my ( $self, $c ) = @_;
+    $c->visit('/global_action');
+}
+
+sub with_args : Local {
+    my ( $self, $c, $arg ) = @_;
+    $c->visit( 'args', [$arg] );
+}
+
+sub with_method_and_args : Local {
+    my ( $self, $c, $arg ) = @_;
+    $c->visit( qw/TestApp::Controller::Action::Visit args/, [$arg] );
+}
+
+sub args : Local {
+    my ( $self, $c, $val ) = @_;
+    die "passed argument does not match args" unless $val eq $c->req->args->[0];
+    $c->res->body($val);
+}
+
+sub args_embed_relative : Local {
+    my ( $self, $c ) = @_;
+    $c->visit('embed/ok');
+}
+
+sub args_embed_absolute : Local {
+    my ( $self, $c ) = @_;
+    $c->visit('/action/visit/embed/ok');
+}
+
+sub embed : Local {
+    my ( $self, $c, $ok ) = @_;
+    $ok ||= 'not ok';
+    $c->res->body($ok);
+}
+
+sub class_visit_test_action : Local {
+    my ( $self, $c ) = @_;
+    $c->visit(qw/TestApp class_visit_test_method/);
+}
+
+
+
+1;
diff -bBurN Catalyst-Runtime-5.7099_03/t/lib/TestApp/Controller/Action/Visitee.pm Catalyst-Runtime-bailey/t/lib/TestApp/Controller/Action/Visitee.pm
--- Catalyst-Runtime-5.7099_03/t/lib/TestApp/Controller/Action/Visitee.pm	1969-12-31 19:00:00.000000000 -0500
+++ Catalyst-Runtime-bailey/t/lib/TestApp/Controller/Action/Visitee.pm	2008-08-07 11:36:37.000000000 -0400
@@ -0,0 +1,17 @@
+package TestApp::Controller::Action::Visitee;
+
+use strict;
+use base 'TestApp::Controller::Action';
+
+
+sub four : Local {
+    my ( $self, $c ) = @_;
+    $c->visit('five');
+}
+
+sub five : Private {
+    my ( $self, $c ) = @_;
+    $c->visit('View::Dump::Request');
+}
+
+1;
diff -bBurN Catalyst-Runtime-5.7099_03/t/lib/TestApp/Controller/Action/Visitoo.pm Catalyst-Runtime-bailey/t/lib/TestApp/Controller/Action/Visitoo.pm
--- Catalyst-Runtime-5.7099_03/t/lib/TestApp/Controller/Action/Visitoo.pm	1969-12-31 19:00:00.000000000 -0500
+++ Catalyst-Runtime-bailey/t/lib/TestApp/Controller/Action/Visitoo.pm	2008-08-11 23:57:18.000000000 -0400
@@ -0,0 +1,11 @@
+package TestApp::Controller::Action::Visitoo;
+
+use strict;
+use base 'TestApp::Controller::Action';
+
+sub three : Local {
+    my ( $self, $c ) = @_;
+    $c->visit( 'TestApp::Controller::Action::Visitee', 'four' );
+}
+
+1;
diff -bBurN Catalyst-Runtime-5.7099_03/t/lib/TestApp.pm Catalyst-Runtime-bailey/t/lib/TestApp.pm
--- Catalyst-Runtime-5.7099_03/t/lib/TestApp.pm	2008-06-27 05:17:36.000000000 -0400
+++ Catalyst-Runtime-bailey/t/lib/TestApp.pm	2008-08-12 00:49:42.000000000 -0400
@@ -77,6 +77,11 @@
     $c->response->headers->header( 'X-Class-Go-Test-Method' => 1 );
 }
 
+sub class_visit_test_method :Private {
+    my ( $self, $c ) = @_;
+    $c->response->headers->header( 'X-Class-Visit-Test-Method' => 1 );
+}
+
 sub loop_test : Local {
     my ( $self, $c ) = @_;
 
diff -bBurN Catalyst-Runtime-5.7099_03/t/live_component_controller_action_visit.t Catalyst-Runtime-bailey/t/live_component_controller_action_visit.t
--- Catalyst-Runtime-5.7099_03/t/live_component_controller_action_visit.t	1969-12-31 19:00:00.000000000 -0500
+++ Catalyst-Runtime-bailey/t/live_component_controller_action_visit.t	2008-08-12 00:51:32.000000000 -0400
@@ -0,0 +1,223 @@
+#!perl
+
+use strict;
+use warnings;
+
+use FindBin;
+use lib "$FindBin::Bin/lib";
+
+our $iters;
+
+BEGIN { $iters = $ENV{CAT_BENCH_ITERS} || 1; }
+
+use Test::More tests => 40 * $iters;
+use Catalyst::Test 'TestApp';
+
+if ( $ENV{CAT_BENCHMARK} ) {
+    require Benchmark;
+    Benchmark::timethis( $iters, \&run_tests );
+}
+else {
+    for ( 1 .. $iters ) {
+        run_tests();
+    }
+}
+
+sub run_tests {
+    {
+        my @expected = qw[
+          TestApp::Controller::Action::Visit->one
+          TestApp::Controller::Action::Visit->two
+          TestApp::Controller::Action::Visitoo->three
+          TestApp::Controller::Action::Visitee->four
+          TestApp::Controller::Action::Visitee->five
+          TestApp::View::Dump::Request->process
+          TestApp->end
+          TestApp->end
+          TestApp->end
+          TestApp->end
+          TestApp->end
+          TestApp->end
+        ];
+
+        @expected = map { /Action/ ? (_begin($_), $_) : ($_) } @expected;
+        my $expected = join( ", ", @expected );
+
+        # Test visiting global private action
+        ok( my $response = request('http://localhost/action/visit/global'),
+            'Request' );
+        ok( $response->is_success, 'Response Successful 2xx' );
+        is( $response->content_type, 'text/plain', 'Response Content-Type' );
+        is( $response->header('X-Catalyst-Action'),
+            'action/visit/global', 'Main Class Action' );
+
+        # Test visiting chain of actions, with intervening begin() calls
+        ok( $response = request('http://localhost/action/visit/one'),
+            'Request' );
+        ok( $response->is_success, 'Response Successful 2xx' );
+        is( $response->content_type, 'text/plain', 'Response Content-Type' );
+        is( $response->header('X-Catalyst-Action'),
+            'action/visit/one', 'Test Action' );
+        is(
+            $response->header('X-Test-Class'),
+            'TestApp::Controller::Action::Visitee',
+            'Test Class'
+        );
+        is( $response->header('X-Catalyst-Executed'),
+            $expected, 'Executed actions' );
+        like(
+            $response->content,
+            qr/^bless\( .* 'Catalyst::Request' \)$/s,
+            'Content is a serialized Catalyst::Request'
+        );
+    }
+
+    {
+        ok(
+            my $response =
+              request('http://localhost/action/visit/with_args/old'),
+            'Request with args'
+        );
+        ok( $response->is_success, 'Response Successful 2xx' );
+        is( $response->content, 'old' );
+    }
+
+    {
+        ok(
+            my $response = request(
+                'http://localhost/action/visit/with_method_and_args/new'),
+            'Request with args and method'
+        );
+        ok( $response->is_success, 'Response Successful 2xx' );
+        is( $response->content, 'new' );
+    }
+
+    # test visit with embedded args
+    {
+        ok(
+            my $response =
+              request('http://localhost/action/visit/args_embed_relative'),
+            'Request'
+        );
+        ok( $response->is_success, 'Response Successful 2xx' );
+        is( $response->content, 'ok' );
+    }
+
+    {
+        ok(
+            my $response =
+              request('http://localhost/action/visit/args_embed_absolute'),
+            'Request'
+        );
+        ok( $response->is_success, 'Response Successful 2xx' );
+        is( $response->content, 'ok' );
+    }
+    {
+        my @expected = qw[
+          TestApp::Controller::Action::TestRelative->relative_visit
+          TestApp::Controller::Action::Visit->one
+          TestApp::Controller::Action::Visit->two
+          TestApp::Controller::Action::Visitoo->three
+          TestApp::Controller::Action::Visitee->four
+          TestApp::Controller::Action::Visitee->five
+          TestApp::View::Dump::Request->process
+          TestApp->end
+          TestApp->end
+          TestApp->end
+          TestApp->end
+          TestApp->end
+          TestApp->end
+          TestApp->end
+        ];
+
+        @expected = map { /Action/ ? (_begin($_), $_) : ($_) } @expected;
+        my $expected = join( ", ", @expected );
+
+        # Test visit to chain of actions.
+        ok( my $response = request('http://localhost/action/relative/relative_visit'),
+            'Request' );
+        ok( $response->is_success, 'Response Successful 2xx' );
+        is( $response->content_type, 'text/plain', 'Response Content-Type' );
+        is( $response->header('X-Catalyst-Action'),
+            'action/relative/relative_visit', 'Test Action' );
+        is(
+            $response->header('X-Test-Class'),
+            'TestApp::Controller::Action::Visitee',
+            'Test Class'
+        );
+        is( $response->header('X-Catalyst-Executed'),
+            $expected, 'Executed actions' );
+        like(
+            $response->content,
+            qr/^bless\( .* 'Catalyst::Request' \)$/s,
+            'Content is a serialized Catalyst::Request'
+        );
+    }
+    {
+        my @expected = qw[
+          TestApp::Controller::Action::TestRelative->relative_visit_two
+          TestApp::Controller::Action::Visit->one
+          TestApp::Controller::Action::Visit->two
+          TestApp::Controller::Action::Visitoo->three
+          TestApp::Controller::Action::Visitee->four
+          TestApp::Controller::Action::Visitee->five
+          TestApp::View::Dump::Request->process
+          TestApp->end
+          TestApp->end
+          TestApp->end
+          TestApp->end
+          TestApp->end
+          TestApp->end
+          TestApp->end
+        ];
+
+        @expected = map { /Action/ ? (_begin($_), $_) : ($_) } @expected;
+        my $expected = join( ", ", @expected );
+
+        # Test visiting chain of actions.
+        ok(
+            my $response =
+              request('http://localhost/action/relative/relative_visit_two'),
+            'Request'
+        );
+        ok( $response->is_success, 'Response Successful 2xx' );
+        is( $response->content_type, 'text/plain', 'Response Content-Type' );
+        is(
+            $response->header('X-Catalyst-Action'),
+            'action/relative/relative_visit_two',
+            'Test Action'
+        );
+        is(
+            $response->header('X-Test-Class'),
+            'TestApp::Controller::Action::Visitee',
+            'Test Class'
+        );
+        is( $response->header('X-Catalyst-Executed'),
+            $expected, 'Executed actions' );
+        like(
+            $response->content,
+            qr/^bless\( .* 'Catalyst::Request' \)$/s,
+            'Content is a serialized Catalyst::Request'
+        );
+    }
+
+    # test class visit 
+    {
+        ok(
+            my $response = request(
+                'http://localhost/action/visit/class_visit_test_action'),
+            'Request'
+        );
+        ok( $response->is_success, 'Response Successful 2xx' );
+        is( $response->header('X-Class-Visit-Test-Method'), 1,
+            'Test Method' );
+    }
+
+}
+
+sub _begin {
+    local $_ = shift;
+    s/->(.*)$/->begin/;
+    return $_;
+}
+


## End of patch ##
