- forward now uses stack
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
index 9fee7be..7d6e4fa 100644 (file)
@@ -19,11 +19,14 @@ use Scalar::Util qw/weaken/;
 use attributes;
 
 __PACKAGE__->mk_accessors(
-    qw/counter depth request response state action namespace/
+    qw/counter request response state action stack namespace/
 );
 
 attributes->import( __PACKAGE__, \&namespace, 'lvalue' );
 
+sub depth { scalar @{shift->stack||[]}; }
+#sub namespace { my $a = shift->stack->[-1]; ($a ? $a->namespace : ''); }
+
 # Laziness++
 *comp = \&component;
 *req  = \&request;
@@ -789,6 +792,10 @@ sub benchmark {
 
 Contains the components.
 
+=item $c->context_class($class)
+
+Contains the context class.
+
 =item $c->counter
 
 Returns a hashref containing coderefs and execution counts.
@@ -806,6 +813,10 @@ Dispatch request to actions.
 
 sub dispatch { my $c = shift; $c->dispatcher->dispatch( $c, @_ ) }
 
+=item $c->dispatcher_class($class)
+
+Contains the dispatcher class.
+
 =item dump_these
 
 Returns a list of 2-element array references (name, structure) pairs that will
@@ -818,6 +829,10 @@ sub dump_these {
     [ Request => $c->req ], [ Response => $c->res ], [ Stash => $c->stash ],;
 }
 
+=item $c->engine_class($class)
+
+Contains the engine class.
+
 =item $c->execute($class, $coderef)
 
 Execute a coderef in given class and catch exceptions.
@@ -847,7 +862,7 @@ sub execute {
 
         $action = "-> $action" if $callsub =~ /forward$/;
     }
-    $c->{depth}++;
+    push(@{$c->stack}, $code);
     eval {
         if ( $c->debug )
         {
@@ -864,11 +879,11 @@ sub execute {
             $c->state( &$code( $class, $c, @{ $c->req->args } ) || 0 );
         }
     };
-    $c->{depth}--;
+    pop(@{$c->stack});
 
     if ( my $error = $@ ) {
 
-        if ( $error eq $DETACH ) { die $DETACH if $c->{depth} > 1 }
+        if ( $error eq $DETACH ) { die $DETACH if $c->depth > 1 }
         else {
             unless ( ref $error ) {
                 chomp $error;
@@ -1071,7 +1086,7 @@ sub prepare {
     my $c = $class->context_class->new(
         {
             counter => {},
-            depth   => 0,
+            stack   => [],
             request => $class->request_class->new(
                 {
                     arguments        => [],
@@ -1315,6 +1330,14 @@ Prepare the output for writing.
 
 sub prepare_write { my $c = shift; $c->engine->prepare_write( $c, @_ ) }
 
+=item $c->request_class($class)
+
+Contains the request class.
+
+=item $c->response_class($class)
+
+Contains the response class.
+
 =item $c->read( [$maxlength] )
 
 Read a chunk of data from the request body.  This method is designed to be