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 || [] }; }
+
# Laziness++
*comp = \&component;
*req = \&request;
require Module::Pluggable::Fast;
# Helper script generation
-our $CATALYST_SCRIPT_GEN = 10;
+our $CATALYST_SCRIPT_GEN = 11;
__PACKAGE__->mk_classdata($_)
- for qw/components arguments dispatcher engine log/;
+ for qw/components arguments dispatcher engine log dispatcher_class
+ engine_class context_class request_class response_class/;
+
+__PACKAGE__->dispatcher_class('Catalyst::Dispatcher');
+__PACKAGE__->engine_class('Catalyst::Engine::CGI');
+__PACKAGE__->request_class('Catalyst::Request');
+__PACKAGE__->response_class('Catalyst::Response');
-our $VERSION = '5.49_03';
+our $VERSION = '5.49_04';
sub import {
my ( $class, @arguments ) = @_;
script/myapp_create.pl view Stuff
script/myapp_create.pl controller Yada
- # built in testserver
+ # built in testserver -- use -r to restart automatically on changes
script/myapp_server.pl
# command line interface
use Catalyst;
sub debug { 1 }
-=item -Dispatcher
-
-Force Catalyst to use a specific dispatcher.
-
=item -Engine
Force Catalyst to use a specific engine.
=item $c->action
-Accessor for the current action
+Accessor for the current action. Returns a L<Catalyst::Action> object,
+which stringifies to the action name.
=item $c->comp($name)
=item $c->dispatcher
-Contains the dispatcher instance.
-Stringifies to class.
+Contains the dispatcher instance. Stringifies to class name.
=item $c->forward( $command [, \@arguments ] )
Forward processing to a private action or a method from a class.
If you define a class without method it will default to process().
also takes an optional arrayref containing arguments to be passed
-to the new function. $c->req->args will be reset upon returning
+to the new function. $c->req->args will be restored upon returning
from the function.
$c->forward('/foo');
=item $c->namespace
-Accessor to the namespace of the current action
+Returns the namespace of the current action, i.e., the uri prefix corresponding to the
+controller of the current action.
=item $c->path_to(@path)
=item $c->setup
-Setup.
+Initializes the dispatcher and engine, loads any plugins, and loads the
+model, view, and controller components.
$c->setup;
}
}
- $class->log->warn( "You are running an old helper script! "
- . "Please update your scripts by regenerating the "
- . "application and copying over the new scripts." )
- if ( $ENV{CATALYST_SCRIPT_GEN}
- && ( $ENV{CATALYST_SCRIPT_GEN} < $Catalyst::CATALYST_SCRIPT_GEN ) );
+ $class->log->warn(
+ <<"EOF") if ( $ENV{CATALYST_SCRIPT_GEN} && ( $ENV{CATALYST_SCRIPT_GEN} < $Catalyst::CATALYST_SCRIPT_GEN ) );
+You are running an old script!
+
+ Please update by running:
+ catalyst.pl -nonew -scripts $class
+EOF
if ( $class->debug ) {
$c->error('Something bad happened');
-Clean errors.
+Clear errors.
$c->error(0);
=item $c->engine
-Contains the engine instance.
-Stringifies to the class.
+Contains the engine instance. Stringifies to the class name.
=item $c->log
Contains the logging object. Unless it is already set Catalyst sets this up with a
-C<Catalyst::Log> object. To use your own log class:
+L<Catalyst::Log> object. To use your own log class:
$c->log( MyLogger->new );
$c->log->info("now logging with my own logger!");
-Your log class should implement the methods described in the C<Catalyst::Log>
+Your log class should implement the methods described in the L<Catalyst::Log>
man page.
=item $c->plugin( $name, $class, @args )
=item $c->components
-Contains the components.
+Returns a hash of components.
+
+=item $c->context_class
+
+Returns or sets the context class.
=item $c->counter
-Returns a hashref containing coderefs and execution counts.
-(Needed for deep recursion detection)
+Returns a hashref containing coderefs and execution counts (needed for deep recursion detection).
=item $c->depth
-Returns the actual forward depth.
+Returns the number of actions on the current internal execution stack.
=item $c->dispatch
-Dispatch request to actions.
+Dispatches a request to actions.
=cut
sub dispatch { my $c = shift; $c->dispatcher->dispatch( $c, @_ ) }
+=item $c->dispatcher_class
+
+Returns or sets the dispatcher class.
+
=item dump_these
Returns a list of 2-element array references (name, structure) pairs that will
[ Request => $c->req ], [ Response => $c->res ], [ Stash => $c->stash ],;
}
+=item $c->engine_class
+
+Returns or sets the engine class.
+
=item $c->execute($class, $coderef)
Execute a coderef in given class and catch exceptions.
my ( $c, $class, $code ) = @_;
$class = $c->components->{$class} || $class;
$c->state(0);
- my $callsub = ( caller(1) )[3];
+
+ my $callsub =
+ ( caller(0) )[0]->isa('Catalyst::Action')
+ ? ( caller(2) )[3]
+ : ( caller(1) )[3];
my $action = '';
if ( $c->debug ) {
$action = "-> $action" if $callsub =~ /forward$/;
}
- $c->{depth}++;
+ push( @{ $c->stack }, $code );
eval {
if ( $c->debug )
{
$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;
=item $c->finalize
-Finalize request.
+Finalizes the request.
=cut
=item $c->finalize_body
-Finalize body.
+Finalizes body.
=cut
=item $c->finalize_cookies
-Finalize cookies.
+Finalizes cookies.
=cut
=item $c->finalize_error
-Finalize error.
+Finalizes error.
=cut
=item $c->finalize_headers
-Finalize headers.
+Finalizes headers.
=cut
=item $c->finalize_read
-Finalize the input after reading is complete.
+Finalizes the input after reading is complete.
=cut
=item $c->finalize_uploads
-Finalize uploads. Cleans up any temporary files.
+Finalizes uploads. Cleans up any temporary files.
=cut
=item $c->get_action( $action, $namespace )
-Get an action in a given namespace.
+Gets an action in a given namespace.
=cut
=item $c->get_actions( $action, $namespace )
-Get all actions of a given name in a namespace and all base namespaces.
+Gets all actions of a given name in a namespace and all parent namespaces.
=cut
=item handle_request( $class, @arguments )
-Handles the request.
+Called to handle each HTTP request.
=cut
=item $c->prepare(@arguments)
-Turns the engine-specific request( Apache, CGI ... )
-into a Catalyst context .
+Creates a Catalyst context from an engine-specific request (Apache, CGI, etc.).
=cut
sub prepare {
my ( $class, @arguments ) = @_;
- my $c = bless {
- counter => {},
- depth => 0,
- request => Catalyst::Request->new(
- {
- arguments => [],
- body_parameters => {},
- cookies => {},
- headers => HTTP::Headers->new,
- parameters => {},
- query_parameters => {},
- secure => 0,
- snippets => [],
- uploads => {}
- }
- ),
- response => Catalyst::Response->new(
- {
- body => '',
- cookies => {},
- headers => HTTP::Headers->new(),
- status => 200
- }
- ),
- stash => {},
- state => 0
- }, $class;
+ $class->context_class( ref $class || $class ) unless $class->context_class;
+ my $c = $class->context_class->new(
+ {
+ counter => {},
+ stack => [],
+ request => $class->request_class->new(
+ {
+ arguments => [],
+ body_parameters => {},
+ cookies => {},
+ headers => HTTP::Headers->new,
+ parameters => {},
+ query_parameters => {},
+ secure => 0,
+ snippets => [],
+ uploads => {}
+ }
+ ),
+ response => $class->response_class->new(
+ {
+ body => '',
+ cookies => {},
+ headers => HTTP::Headers->new(),
+ status => 200
+ }
+ ),
+ stash => {},
+ state => 0
+ }
+ );
# For on-demand data
$c->request->{_context} = $c;
=item $c->prepare_action
-Prepare action.
+Prepares action.
=cut
=item $c->prepare_body
-Prepare message body.
+Prepares message body.
=cut
=item $c->prepare_body_chunk( $chunk )
-Prepare a chunk of data before sending it to HTTP::Body.
+Prepares a chunk of data before sending it to L<HTTP::Body>.
=cut
=item $c->prepare_body_parameters
-Prepare body parameters.
+Prepares body parameters.
=cut
=item $c->prepare_connection
-Prepare connection.
+Prepares connection.
=cut
=item $c->prepare_cookies
-Prepare cookies.
+Prepares cookies.
=cut
=item $c->prepare_headers
-Prepare headers.
+Prepares headers.
=cut
=item $c->prepare_parameters
-Prepare parameters.
+Prepares parameters.
=cut
=item $c->prepare_path
-Prepare path and base.
+Prepares path and base.
=cut
=item $c->prepare_query_parameters
-Prepare query parameters.
+Prepares query parameters.
=cut
=item $c->prepare_read
-Prepare the input for reading.
+Prepares the input for reading.
=cut
=item $c->prepare_request
-Prepare the engine request.
+Prepares the engine request.
=cut
=item $c->prepare_uploads
-Prepare uploads.
+Prepares uploads.
=cut
=item $c->prepare_write
-Prepare the output for writing.
+Prepares the output for writing.
=cut
sub prepare_write { my $c = shift; $c->engine->prepare_write( $c, @_ ) }
+=item $c->request_class
+
+Returns or sets the request class.
+
+=item $c->response_class
+
+Returns or sets the response class.
+
=item $c->read( [$maxlength] )
-Read a chunk of data from the request body. This method is designed to be
+Reads a chunk of data from the request body. This method is designed to be
used in a while loop, reading $maxlength bytes on every call. $maxlength
defaults to the size of the request if not specified.
=item $c->set_action( $action, $code, $namespace, $attrs )
-Set an action in a given namespace.
+Sets an action in a given namespace.
=cut
=item $c->setup_actions($component)
-Setup actions for a component.
+Sets up actions for a component.
=cut
=item $c->setup_components
-Setup components.
+Sets up components.
=cut
return $component;
}
- my $suffix = Catalyst::Utils::class2classsuffix($class);
+ my $suffix = Catalyst::Utils::class2classsuffix($component);
my $config = $class->config->{$suffix} || {};
my $instance;
}
unless ($dispatcher) {
- $dispatcher = 'Catalyst::Dispatcher';
+ $dispatcher = $class->dispatcher_class;
}
$dispatcher->require;
}
unless ($engine) {
- $engine = 'Catalyst::Engine::CGI';
+ $engine = $class->engine_class;
}
$engine->require;
}
}
+=item $c->stack
+
+Contains the stack.
+
=item $c->write( $data )
Writes $data to the output stream. When using this method directly, you will
=item version
-Returns the Catalyst version number. mostly useful for powered by messages
+Returns the Catalyst version number. Mostly useful for "powered by" messages
in template systems.
=cut
=item L<Catalyst::Manual> - The Catalyst Manual
+=item L<Catalyst::Component>, L<Catalyst::Base> - Base classes for components
+
=item L<Catalyst::Engine> - Core Engine
=item L<Catalyst::Log> - The Log Class.