"forward" docs updated
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
index 6735051..8896db6 100644 (file)
@@ -1,7 +1,7 @@
 package Catalyst;
 
 use strict;
-use base 'Catalyst::Base';
+use base 'Catalyst::Component';
 use bytes;
 use UNIVERSAL::require;
 use Catalyst::Exception;
@@ -10,6 +10,7 @@ use Catalyst::Request;
 use Catalyst::Request::Upload;
 use Catalyst::Response;
 use Catalyst::Utils;
+use Catalyst::Controller;
 use File::stat;
 use NEXT;
 use Text::SimpleTable;
@@ -71,7 +72,7 @@ sub import {
 
     unless ( $caller->isa('Catalyst') ) {
         no strict 'refs';
-        push @{"$caller\::ISA"}, $class;
+        push @{"$caller\::ISA"}, $class, 'Catalyst::Controller';
     }
 
     $caller->arguments( [@arguments] );
@@ -245,7 +246,10 @@ in an arrayref. The action will receive the arguments in C<@_> and
 C<$c-E<gt>req-E<gt>args>. Upon returning from the function,
 C<$c-E<gt>req-E<gt>args> will be restored to the previous values.
 
-    $c->forward('/foo');
+Any data C<return>ed from the action forwarded to, will be returned by the
+call to to forward.
+
+    my $foodata = $c->forward('/foo');
     $c->forward('index');
     $c->forward(qw/MyApp::Model::CDBI::Foo do_stuff/);
     $c->forward('MyApp::View::TT');
@@ -444,6 +448,12 @@ Returns or takes a hashref containing the application's configuration.
 
     __PACKAGE__->config({ db => 'dsn:SQLite:foo.db' });
 
+You can also use a L<YAML> config file like myapp.yml in your
+applications home directory.
+
+    ---
+    db: dsn:SQLite:foo.db
+
 =head2 $c->debug
 
 Overload to enable debug messages (same as -Debug option).
@@ -464,10 +474,16 @@ L<Catalyst::Engine>.
 
 =head2 $c->log
 
-Returns the logging object instance. Unless it is already set, Catalyst
-sets this up with a L<Catalyst::Log> object. To use your own log class:
+Returns the logging object instance. Unless it is already set, Catalyst sets
+this up with a L<Catalyst::Log> object. To use your own log class, set the
+logger with the C<< __PACKAGE__->log >> method prior to calling
+C<< __PACKAGE__->setup >>.
+
+ __PACKAGE__->log( MyLogger->new );
+ __PACKAGE__->setup;
+
+And later:
 
-    $c->log( MyLogger->new );
     $c->log->info( 'Now logging with my own logger!' );
 
 Your log class should implement the methods described in the
@@ -575,10 +591,10 @@ sub setup {
     $class->setup_home( delete $flags->{home} );
 
     # YAML config support
-    my $conffile = $class->config->{file}
-      || ( Catalyst::Utils::appprefix( ref $class || $class ) . '.yml' );
-    my $confpath = $class->path_to($conffile);
-    my $conf     = {};
+    my $confpath = $class->config->{file}
+      || $class->path_to(
+        ( Catalyst::Utils::appprefix( ref $class || $class ) . '.yml' ) );
+    my $conf = {};
     $conf = YAML::LoadFile($confpath) if -f $confpath;
     my $oldconf = $class->config;
     $class->config( { %$oldconf, %$conf } );
@@ -927,15 +943,20 @@ sub execute {
         }
 
         # determine if the call was the result of a forward
-        my $callsub_index = ( caller(0) )[0]->isa('Catalyst::Action') ? 2 : 1;
-        if ( ( caller($callsub_index) )[3] =~ /^NEXT/ ) {
-
-            # work around NEXT if execute was extended by a plugin
-            $callsub_index += 3;
+        # this is done by walking up the call stack and looking for a calling
+        # sub of Catalyst::forward before the eval
+        my $callsub = q{};
+        for my $index ( 1 .. 10 ) {
+            last
+              if ( ( caller($index) )[0] eq 'Catalyst'
+                && ( caller($index) )[3] eq '(eval)' );
+
+            if ( ( caller($index) )[3] =~ /forward$/ ) {
+                $callsub = ( caller($index) )[3];
+                $action  = "-> $action";
+                last;
+            }
         }
-        my $callsub = ( caller($callsub_index) )[3];
-
-        $action = "-> $action" if $callsub =~ /forward$/;
 
         my $node = Tree::Simple->new(
             {
@@ -1538,7 +1559,7 @@ sub setup_components {
     my $callback = sub {
         my ( $component, $context ) = @_;
 
-        unless ( $component->isa('Catalyst::Component') ) {
+        unless ( $component->can('COMPONENT') ) {
             return $component;
         }