=head1 METHODS
-=head2 Information about the current request
+=head2 INFORMATION ABOUT THE CURRENT REQUEST
=head2 $c->action
Returns the current L<Catalyst::Request> object. See
L<Catalyst::Request>.
-=head2 Processing and response to the current request
+=head2 PROCESSING AND RESPONSE TO THE CURRENT REQUEST
=head2 $c->forward( $action [, \@arguments ] )
my $foodata = $c->forward('/foo');
$c->forward('index');
- $c->forward(qw/MyApp::Model::CDBI::Foo do_stuff/);
+ $c->forward(qw/MyApp::Model::DBIC::Foo do_stuff/);
$c->forward('MyApp::View::TT');
=cut
return $comp;
}
-=head2 Component Accessors
+# Return a component if only one matches.
+sub _comp_singular {
+ my ($c, @prefixes) = @_;
+
+ my $appclass = ref $c || $c;
+
+ my ($comp,$rest) = map { $c->_comp_search("^${appclass}::${_}::") }
+ @prefixes;
+ return $comp unless $rest;
+}
+
+=head2 COMPONENT ACCESSORS
=head2 $c->comp($name)
$c->controller('Foo')->do_stuff;
+If name is omitted, will return the controller for the dispatched action.
+
=cut
sub controller {
my ( $c, $name ) = @_;
- return $c->_comp_prefixes($name, qw/Controller C/);
+ return $c->_comp_prefixes($name, qw/Controller C/)
+ if ($name);
+ return $c->component($c->action->class);
}
=head2 $c->model($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 model, and forward to it if that's the case.
+
=cut
sub model {
my ( $c, $name ) = @_;
- return $c->_comp_prefixes($name, qw/Model M/);
+ return $c->_comp_prefixes($name, qw/Model M/)
+ if $name;
+ return $c->comp($c->config->{default_model})
+ if $c->config->{default_model};
+ return $c->_comp_singular(qw/Model M/);
+
}
=head2 $c->view($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.
+
=cut
sub view {
my ( $c, $name ) = @_;
- return $c->_comp_prefixes($name, qw/View V/);
+ return $c->_comp_prefixes($name, qw/View V/)
+ if $name;
+ return $c->comp($c->config->{default_view})
+ if $c->config->{default_view};
+ return $c->_comp_singular(qw/View V/);
}
=head2 Class data and helper classes
=cut
-=head2 Utility methods
+=head2 UTILITY METHODS
=head2 $c->path_to(@path)
$class = $c->component($class) || $class;
$c->state(0);
+ if ($c->depth >= $RECURSION) {
+ my $action = "$code";
+ $action = "/$action" unless $action =~ /\-\>/;
+ my $error = qq/Deep recursion detected calling "$action"/;
+ $c->log->error($error);
+ $c->error($error);
+ $c->state(0);
+ return $c->state;
+ }
+
+
if ( $c->debug ) {
my $action = "$code";
$action = "/$action" unless $action =~ /\-\>/;
$c->counter->{"$code"}++;
- if ( $c->counter->{"$code"} > $RECURSION ) {
- my $error = qq/Deep recursion detected in "$action"/;
- $c->log->error($error);
- $c->error($error);
- $c->state(0);
- return $c->state;
- }
-
# determine if the call was the result of a forward
# this is done by walking up the call stack and looking for a calling
# sub of Catalyst::forward before the eval
sub get_actions { my $c = shift; $c->dispatcher->get_actions( $c, @_ ) }
-=head2 handle_request( $class, @arguments )
+=head2 $c->handle_request( $class, @arguments )
Called to handle each HTTP request.
=head2 $c->stack
-Returns the stack.
+Returns an arrayref of the internal execution stack (actions that are currently
+executing).
=head2 $c->write( $data )
Brian Cassidy
+Carl Franks
+
Christian Hansen
Christopher Hicks