Rearrangement of Intro.pod
Jesse Sheidlower [Thu, 6 Jul 2006 04:34:17 +0000 (04:34 +0000)]
lib/Catalyst/Manual/Intro.pod

index 39cf95e..9f39c49 100644 (file)
@@ -191,509 +191,467 @@ Both of these URLs should take you to the welcome page.)
 
 =back
 
-Easy!
-
 =head2 How It Works
 
 Let's see how Catalyst works, by taking a closer look at the components
 and other parts of a Catalyst application.
 
-=head3 Application Class
+=head3 Components
 
-In addition to the Model, View, and Controller components, there's a
-single class that represents your application itself. This is where you
-configure your application, load plugins, and extend Catalyst.
+Catalyst has an uncommonly flexible component system. You can define as
+many L</Models>, L</Views>, and L</Controllers> as you like. As discussed
+previously, the general idea is that the View is responsible for the
+output of data to the user (typically via a web browser, but a View can
+also generate PDFs or e-mails, for example); the Model is responsible 
+for providing data (typically from a relational database); and the
+Controller is responsible for interacting with the user and deciding
+how user input determines what actions the application takes.
+
+In the world of MVC, there are frequent discussions and disagreements
+about the nature of each element - whether certain types of logic
+belong in the Model or the Controller, etc. Catalyst's flexibility
+means that this decision is entirely up to you, the programmer; 
+Catalyst doesn't enforce anything. See L<Catalyst::Manual::About> for
+a general discussion of these concerns.
 
-    package MyApp;
+All components must inherit from L<Catalyst::Base>, which provides a
+simple class structure and some common class methods like C<config> and
+C<new> (constructor).
+
+    package MyApp::Controller::Catalog;
 
     use strict;
-    use Catalyst qw/-Debug/; # Add other plugins here, e.g.
-                             # for session support
+    use base 'Catalyst::Base';
 
-    MyApp->config(
-        name => 'My Application',
+    __PACKAGE__->config( foo => 'bar' );
 
-        # You can put anything else you want in here:
-        my_configuration_variable => 'something',
-    );
     1;
 
-In older versions of Catalyst, the application class was where you put
-global actions. However, as of version 5.66, the recommended practice is
-to place such actions in a special Root controller (see L</Actions>,
-below), to avoid namespace collisions.
+You don't have to C<use> or otherwise register Models, Views, and
+Controllers.  Catalyst automatically discovers and instantiates them
+when you call C<setup> in the main application. All you need to do is
+put them in directories named for each Component type. You can use a
+short alias for each one.
 
 =over 4
 
-=item * B<name>
+=item * B<MyApp/Model/> 
 
-The name of your application.
+=item * B<MyApp/M/>
+
+=item * B<MyApp/View/>
+
+=item * B<MyApp/V/>
+
+=item * B<MyApp/Controller/>
+
+=item * B<MyApp/C/>
 
 =back
 
-Optionally, you can specify a B<root> parameter for templates and static
-data.  If omitted, Catalyst will try to auto-detect the directory's
-location. You can define as many parameters as you want for plugins or
-whatever you need. You can access them anywhere in your application via
-C<$context-E<gt>config-E<gt>{$param_name}>.
+In older versions of Catalyst, the recommended practice (and the one
+automatically created by helper scripts) was to name the directories
+C<M/>, C<V/>, and C<C/>. Though these still work, we now recommend
+the use of the full names.
 
-=head3 Context
+=head4 Views
 
-Catalyst automatically blesses a Context object into your application
-class and makes it available everywhere in your application. Use the
-Context to directly interact with Catalyst and glue your L</Components>
-together. For example, if you need to use the Context from within a
-Template Toolkit template, it's already there:
+To show how to define views, we'll use an already-existing base class for the
+L<Template Toolkit|Template>, L<Catalyst::View::TT>. All we need to do is
+inherit from this class:
 
-    <h1>Welcome to [% c.config.name %]!</h1>
+    package MyApp::View::TT;
 
-As illustrated in our URL-to-Action dispatching example, the Context is
-always the second method parameter, behind the Component object
-reference or class name itself. Previously we called it C<$context> for
-clarity, but most Catalyst developers just call it C<$c>:
+    use strict;
+    use base 'Catalyst::View::TT';
 
-    sub hello : Global {
-        my ( $self, $c ) = @_;
-        $c->res->body('Hello World!');
-    }
+    1;
 
-The Context contains several important objects:
+(You can also generate this automatically by using the helper script:
 
-=over 4
+    script/myapp_create.pl view TT TT
 
-=item * L<Catalyst::Request>
+where the first C<TT> tells the script that the name of the view should
+be C<TT>, and the second that it should be a Template Toolkit view.)
 
-    $c->request
-    $c->req # alias
+This gives us a process() method and we can now just do
+$c->forward('MyApp::View::TT') to render our templates. The base class
+makes process() implicit, so we don't have to say
+C<$c-E<gt>forward(qw/MyApp::View::TT process/)>.
 
-The request object contains all kinds of request-specific information, like
-query parameters, cookies, uploads, headers, and more.
+    sub hello : Global {
+        my ( $self, $c ) = @_;
+        $c->stash->{template} = 'hello.tt';
+    }
 
-    $c->req->params->{foo};
-    $c->req->cookies->{sessionid};
-    $c->req->headers->content_type;
-    $c->req->base;
-    $c->req->uri_with( { page = $pager->next_page } );
+    sub end : Private {
+        my ( $self, $c ) = @_;
+        $c->forward( $c->view('TT') );
+    }
 
-=item * L<Catalyst::Response>
+You normally render templates at the end of a request, so it's a perfect
+use for the global C<end> action.
 
-    $c->response
-    $c->res # alias
+In practice, however, you would use a default C<end> action as supplied
+by L<Catalyst::Action::RenderView>.
 
-The response is like the request, but contains just response-specific
-information.
+Also, be sure to put the template under the directory specified in
+C<$c-E<gt>config-E<gt>{root}>, or you'll end up looking at the debug
+screen.
 
-    $c->res->body('Hello World');
-    $c->res->status(404);
-    $c->res->redirect('http://oook.de');
+=head4 Models
 
-=item * L<Catalyst::Config>
+Models are providers of data. This data could come from anywhere - a
+search engine index, a spreadsheet - but typically a Model represents a
+database table. The data source does not intrinsically have much to do
+with web applications or Catalyst - it could just as easily be used to
+write an offline report generator or a command-line tool.
 
-    $c->config
-    $c->config->root;
-    $c->config->name;
+To show how to define models, again we'll use an already-existing base
+class, this time for L<DBIx::Class>: L<Catalyst::Model::DBIC::Schema>.
+We'll also need L<DBIx::Class::Schema::Loader>.
 
-=item * L<Catalyst::Log>
+But first, we need a database.
 
-    $c->log
-    $c->log->debug('Something happened');
-    $c->log->info('Something you should know');
+    -- myapp.sql
+    CREATE TABLE foo (
+        id INTEGER PRIMARY KEY,
+        data TEXT
+    );
 
-=item * B<Stash>
+    CREATE TABLE bar (
+        id INTEGER PRIMARY KEY,
+        foo INTEGER REFERENCES foo,
+        data TEXT
+    );
 
-    $c->stash
-    $c->stash->{foo} = 'bar';
-    $c->stash->{baz} = {baz => 'qox'};
-    $c->stash->{fred} = [qw/wilma pebbles/];
+    INSERT INTO foo (data) VALUES ('TEST!');
 
-and so on.
+    % sqlite /tmp/myapp.db < myapp.sql
 
-=back
+Now we can create a DBIC::SchemaLoader component for this database.
 
-The last of these, the stash, is a universal hash for sharing data among
-application components. For an example, we return to our 'hello' action:
+    script/myapp_create.pl model DBIC DBIC::SchemaLoader 'dbi:SQLite:/tmp/myapp.db'
 
-    sub hello : Global {
-        my ( $self, $c ) = @_;
-        $c->stash->{message} = 'Hello World!';
-        $c->forward('show_message');
+L<DBIx::Class::Schema::Loader> automatically loads table layouts and
+relationships. Use the stash to pass data to your templates.
+
+We add the following to MyApp/Controller/Root.pm
+
+    sub view : Global {
+        my ( $self, $c, $id ) = @_;
+        
+        $c->stash->{item} = $c->model('DBIC::Foo')->find($id);
     }
 
-    sub show_message : Private {
+    1;
+    
+    sub end : Private {
         my ( $self, $c ) = @_;
-        $c->res->body( $c->stash->{message} );
+        
+        $c->stash->{template} ||= 'index.tt';
+        $c->forward( $c->view('TT') );
     }
 
-Note that the stash should be used only for passing data in an
-individual request cycle; it gets cleared at a new request. If you need
-to maintain persistent data, use a session. See
-L<Catalyst::Plugin::Session> for a comprehensive set of
-Catalyst-friendly session-handling tools.
+We then create a new template file "root/index.tt" containing:
 
-=head3 Actions
+    The Id's data is [% item.data %]
 
-A Catalyst controller is defined by its actions. An action is a
-subroutine with a special attribute. You've already seen some examples
-of actions in this document. The URL (for example
-http://localhost.3000/foo/bar) consists of two parts, the base
-(http://localhost:3000/ in this example) and the path (foo/bar).  Please
-note that the trailing slash after the hostname[:port] always belongs to
-base and not to the action.
+Models do not have to be part of your Catalyst application; you
+can always call an outside module that serves as your Model:
 
-=over 4
+    # in a Controller
+    sub list : Local {
+      my ( $self, $c ) = @_;
+      
+      $c->stash->{template} = 'list.tt';
+      
+      use Some::Outside::Database::Module;
+      my @records = Some::Outside::Database::Module->search({
+        artist => 'Led Zeppelin',
+        });
+      
+      $c->stash->{records} = \@records;
+    }
 
-=item * B<Application Wide Actions>
+But by using a Model that is part of your Catalyst application, you gain
+several things: you don't have to C<use> each component, Catalyst will
+find and load it automatically at compile-time; you can C<forward> to
+the module, which can only be done to Catalyst components; and only
+Catalyst components can be fetched with
+C<$c-E<gt>model('SomeModel')>.
 
-Actions which are called at the root level of the application
-(e.g. http://localhost:3000/ ) go in MyApp::Controller::Root, like
-this:
+Happily, since many people have existing Model classes that they
+would like to use with Catalyst (or, conversely, they want to
+write Catalyst models that can be used outside of Catalyst, e.g.
+in a cron job), it's trivial to write a simple component in
+Catalyst that slurps in an outside Model:
 
-    package MyApp::Controller::Root;
-    use base 'Catalyst::Controller';
-    # Sets the actions in this controller to be registered with no prefix
-    # so they function identically to actions created in MyApp.pm
-    __PACKAGE__->config->{namespace} = '';
-    sub default : Private {
-        my ( $self, $context ) = @_;
-        $context->response->body('Catalyst rocks!');
-    }
+    package MyApp::Model::DB;
+    use base qw/Catalyst::Model::DBIC::Schema/;
+    __PACKAGE__->config(
+        schema_class => 'Some::DBIC::Schema',
+        connect_info => ['dbi:SQLite:foo.db', '', '', {AutoCommit=>1}]
+    );
     1;
 
-=back
+and that's it! Now C<Some::DBIC::Schema> is part of your
+Cat app as C<MyApp::Model::DB>.
 
-=head4 Action types
+Within Catalyst, the common approach to writing a model for your
+application is wrapping a generic model (e.g. L<DBIx::Class::Schema>, a
+bunch of XMLs, or anything really) with an object that contains
+configuration data, convenience methods, and so forth. Thus you
+will in effect have two models - a wrapper model that knows something
+about Catalyst and your web application, and a generic model that is
+totally independent of these needs.
 
-Catalyst supports several types of actions:
+Technically, within Catalyst a model is a B<component> - an instance of
+the model's class belonging to the application. It is important to
+stress that the lifetime of these objects is per application, not per
+request.
+
+While the model base class (L<Catalyst::Model>) provides things like
+C<config> to better integrate the model into the application, sometimes
+this is not enough, and the model requires access to C<$c> itself.
+
+Situations where this need might arise include:
 
 =over 4
 
-=item * B<Literal> (B<Path> actions)
+=item *
 
-    package MyApp::Controller::My::Controller;
-    sub bar : Path('foo/bar') { }
+Interacting with another model
 
-Literal C<Path> actions will act relative to their current
-namespace. The above example matches only
-http://localhost:3000/my/controller/foo/bar. If you start your path with
-a forward slash, it will match from the root. Example:
+=item *
 
-    package MyApp::Controller::My::Controller;
-    sub bar : Path('/foo/bar') { }
+Using per-request data to control behavior
 
-Matches only http://localhost:3000/foo/bar.
+=item *
 
-    package MyApp::Controller::My::Controller;
-    sub bar : Path { }
+Using plugins from a Model (for example L<Catalyst::Plugin::Cache>).
 
-By leaving the C<Path> definition empty, it will match on the namespace
-root. The above code matches http://localhost:3000/my/controller.
+=back
 
-=item * B<Regex>
+From a style perspective it's usually considered bad form to make your
+model "too smart" about things - it should worry about business logic
+and leave the integration details to the controllers. If, however, you
+find that it does not make sense at all to use an auxillary controller
+around the model, and the model's need to access C<$c> cannot be
+sidestepped, there exists a power tool called L</ACCEPT_CONTEXT>.
 
-    sub bar : Regex('^item(\d+)/order(\d+)$') { }
+=head4 Controllers
 
-Matches any URL that matches the pattern in the action key, e.g.
-http://localhost:3000/item23/order42. The '' around the regexp is
-optional, but perltidy likes it. :)
+Multiple controllers are a good way to separate logical domains of your
+application.
 
-Regex matches act globally, i.e. without reference to the namespace from
-which it is called, so that a C<bar> method in the
-C<MyApp::Controller::Catalog::Order::Process> namespace won't match any
-form of C<bar>, C<Catalog>, C<Order>, or C<Process> unless you
-explicitly put this in the regex. To achieve the above, you should
-consider using a C<LocalRegex> action.
+    package MyApp::Controller::Login;
 
-=item * B<LocalRegex>
+    use base qw/Catalyst::Controller/;
 
-    sub bar : LocalRegex('^widget(\d+)$') { }
+    sub login : Path("login") { }
+    sub new_password : Path("new-password") { }
+    sub logout : Path("logout") { }
 
-LocalRegex actions act locally. If you were to use C<bar> in
-C<MyApp::Controller::Catalog>, the above example would match urls like
-http://localhost:3000/catalog/widget23.
+    package MyApp::Controller::Catalog;
 
-If you omit the "C<^>" from your regex, then it will match any depth
-from the controller and not immediately off of the controller name. The
-following example differs from the above code in that it will match
-http://localhost:3000/catalog/foo/widget23 as well.
+    use base qw/Catalyst::Controller/;
 
-    package MyApp::Controller::Catalog;
-    sub bar : LocalRegex('widget(\d+)$') { }
+    sub view : Local { }
+    sub list : Local { }
 
-For both LocalRegex and Regex actions, if you use capturing parentheses
-to extract values within the matching URL, those values are available in
-the C<$c-E<gt>req-E<gt>captures> array. In the above example, "widget23"
-would capture "23" in the above example, and
-C<$c-E<gt>req-E<gt>captures-E<gt>[0]> would be "23". If you want to pass
-arguments at the end of your URL, you must use regex action keys. See
-L</URL Path Handling> below.
+    package MyApp::Controller::Cart;
 
-=item * B<Top-level> (B<Global>)
+    use base qw/Catalyst::Controller/;
 
-    package MyApp::Controller::Foo;
-    sub foo : Global { }
+    sub add : Local { }
+    sub update : Local { }
+    sub order : Local { }
 
-Matches http://localhost:3000/foo. The function name is mapped
-directly to the application base.  You can provide an equivalent
-function in this case  by doing the following:
+Note that you can also supply attributes via the Controller's config so
+long as you have at least one attribute on a subref to be exported
+(:Action is commonly used for this) - for example the following is
+equivalent to the same controller above:
 
-    package MyApp::Controller::Root
-    sub foo : Local { }
+    package MyApp::Controller::Login;
 
-=item * B<Namespace-Prefixed> (B<Local>)
+    use base qw/Catalyst::Controller/;
 
-    package MyApp::Controller::My::Controller; 
-    sub foo : Local { }
+    __PACKAGE__->config(
+      actions => {
+        'sign_in' => { Path => 'sign-in' },
+        'new_password' => { Path => 'new-password' },
+        'sign_out' => { Path => 'sign-out' },
+      },
+    );
 
-Matches http://localhost:3000/my/controller/foo. 
+    sub sign_in : Action { }
+    sub new_password : Action { }
+    sub sign_out : Action { }
 
-This action type indicates that the matching URL must be prefixed with a
-modified form of the component's class (package) name. This modified
-class name excludes the parts that have a pre-defined meaning in
-Catalyst ("MyApp::Controller" in the above example), replaces "::" with
-"/", and converts the name to lower case.  See L</Components> for a full
-explanation of the pre-defined meaning of Catalyst component class
-names.
+=head3 ACCEPT_CONTEXT
 
-=item * B<Chained>
+Whenever you call $c->component("Foo") you get back an object - the
+instance of the model. If the component supports the C<ACCEPT_CONTEXT>
+method instead of returning the model itself, the return value of C<<
+$model->ACCEPT_CONTEXT( $c ) >> will be used.
 
-Catalyst also provides a method to build and dispatch chains of actions,
-like
+This means that whenever your model/view/controller needs to talk to C<$c> it
+gets a chance to do this when it's needed.
 
-    sub catalog : Chained : CaptureArgs(1) {
-        my ( $self, $c, $arg ) = @_;
-        ...
-    }
+A typical C<ACCEPT_CONTEXT> method will either clone the model and return one
+with the context object set, or it will return a thin wrapper that contains
+C<$c> and delegates to the per-application model object.
 
-    sub item : Chained('catalog') : Args(1) {
-        my ( $self, $c, $arg ) = @_;
-        ...
+A typical C<ACCEPT_CONTEXT> method could look like this:
+
+    sub ACCEPT_CONTEXT {
+      my ( $self, $c, @extra_arguments ) = @_;
+      bless { %$self, c => $c }, ref($self);
     }
 
-to handle a C</catalog/*/item/*> path. For extensive information about this
-dispatch type, please see L<Catalyst::DispatchType::Chained>.
+effectively treating $self as a B<prototype object> that gets a new parameter.
+C<@extra_arguments> comes from any trailing arguments to
+C<< $c->component( $bah, @extra_arguments ) >> (or C<< $c->model(...) >>,
+C<< $c->view(...) >> etc).
 
-=item * B<Private>
+The life time of this value is B<per usage>, and not per request. To make this
+per request you can use the following technique:
 
-    sub foo : Private { }
+Add a field to C<$c>, like C<my_model_instance>. Then write your
+C<ACCEPT_CONTEXT> method to look like this:
 
-Matches no URL, and cannot be executed by requesting a URL that
-corresponds to the action key. Private actions can be executed only
-inside a Catalyst application, by calling the C<forward> method:
+    sub ACCEPT_CONTEXT {
+      my ( $self, $c ) = @_;
 
-    $c->forward('foo');
+      if ( my $per_request = $c->my_model_instance ) {
+        return $per_request;
+      } else {
+        my $new_instance = bless { %$self, c => $c }, ref($self);
+        Scalar::Util::weaken($new_instance->{c}); # or we have a circular reference
+        $c->my_model_instance( $new_instance );
+        return $new_instance;
+      }
+    }
 
-See L</Flow Control> for a full explanation of C<forward>. Note that, as
-discussed there, when forwarding from another component, you must use
-the absolute path to the method, so that a private C<bar> method in your
-C<MyApp::Controller::Catalog::Order::Process> controller must, if called
-from elsewhere, be reached with
-C<$c-E<gt>forward('/catalog/order/process/bar')>.
+=head3 Application Class
 
-=item * B<Args>
+In addition to the Model, View, and Controller components, there's a
+single class that represents your application itself. This is where you
+configure your application, load plugins, and extend Catalyst.
 
-Args is not an action type per se, but an action modifier - it adds a
-match restriction to any action it's provided to, requiring only as many
-path parts as are specified for the action to be valid - for example in
-MyApp::Controller::Foo,
+    package MyApp;
 
-  sub bar :Local
+    use strict;
+    use Catalyst qw/-Debug/; # Add other plugins here, e.g.
+                             # for session support
 
-would match any URL starting /foo/bar/. To restrict this you can do
+    MyApp->config(
+        name => 'My Application',
 
-  sub bar :Local :Args(1)
+        # You can put anything else you want in here:
+        my_configuration_variable => 'something',
+    );
+    1;
 
-to only match /foo/bar/*/
+In older versions of Catalyst, the application class was where you put
+global actions. However, as of version 5.66, the recommended practice is
+to place such actions in a special Root controller (see L</Actions>,
+below), to avoid namespace collisions.
+
+=over 4
+
+=item * B<name>
+
+The name of your application.
 
 =back
 
-B<Note:> After seeing these examples, you probably wonder what the point
-is of defining names for regex and path actions. Every public action is
-also a private one, so you have one unified way of addressing components
-in your C<forward>s.
+Optionally, you can specify a B<root> parameter for templates and static
+data.  If omitted, Catalyst will try to auto-detect the directory's
+location. You can define as many parameters as you want for plugins or
+whatever you need. You can access them anywhere in your application via
+C<$context-E<gt>config-E<gt>{$param_name}>.
 
-=head4 Built-in Private Actions
+=head3 Context
 
-In response to specific application states, Catalyst will automatically
-call these built-in private actions in your application class:
+Catalyst automatically blesses a Context object into your application
+class and makes it available everywhere in your application. Use the
+Context to directly interact with Catalyst and glue your L</Components>
+together. For example, if you need to use the Context from within a
+Template Toolkit template, it's already there:
 
-=over 4
+    <h1>Welcome to [% c.config.name %]!</h1>
 
-=item * B<default : Private>
+As illustrated in our URL-to-Action dispatching example, the Context is
+always the second method parameter, behind the Component object
+reference or class name itself. Previously we called it C<$context> for
+clarity, but most Catalyst developers just call it C<$c>:
 
-Called when no other action matches. Could be used, for example, for
-displaying a generic frontpage for the main app, or an error page for
-individual controllers.
+    sub hello : Global {
+        my ( $self, $c ) = @_;
+        $c->res->body('Hello World!');
+    }
 
-If C<default> isn't acting how you would expect, look at using a
-L</Literal> C<Path> action (with an empty path string). The difference
-is that C<Path> takes arguments relative from the namespace and
-C<default> I<always> takes arguments relative from the root, regardless
-of what controller it's in. Indeed, this is now the recommended way of
-handling default situations; the C<default> private controller should
-be considered deprecated.
+The Context contains several important objects:
 
-=item * B<index : Private>
+=over 4
 
-C<index> is much like C<default> except that it takes no arguments
-and it is weighted slightly higher in the matching process. It is
-useful as a static entry point to a controller, e.g. to have a static
-welcome page. Note that it's also weighted higher than Path.
+=item * L<Catalyst::Request>
 
-=item * B<begin : Private>
+    $c->request
+    $c->req # alias
 
-Called at the beginning of a request, before any matching actions are
-called.
+The request object contains all kinds of request-specific information, like
+query parameters, cookies, uploads, headers, and more.
 
-=item * B<end : Private>
+    $c->req->params->{foo};
+    $c->req->cookies->{sessionid};
+    $c->req->headers->content_type;
+    $c->req->base;
+    $c->req->uri_with( { page = $pager->next_page } );
 
-Called at the end of a request, after all matching actions are called.
+=item * L<Catalyst::Response>
 
-=back
+    $c->response
+    $c->res # alias
 
-=head4 Built-in actions in controllers/autochaining
+The response is like the request, but contains just response-specific
+information.
 
-    Package MyApp::Controller::Foo;
-    sub begin : Private { }
-    sub default : Private { }
-    sub auto : Private { }
+    $c->res->body('Hello World');
+    $c->res->status(404);
+    $c->res->redirect('http://oook.de');
 
-You can define built-in private actions within your controllers as
-well. The actions will override the ones in less-specific controllers,
-or your application class. In other words, for each of the three
-built-in private actions, only one will be run in any request
-cycle. Thus, if C<MyApp::Controller::Catalog::begin> exists, it will be
-run in place of C<MyApp::begin> if you're in the C<catalog> namespace,
-and C<MyApp::Controller::Catalog::Order::begin> would override this in
-turn.
-
-=item * B<auto : Private>
-
-In addition to the normal built-in actions, you have a special action
-for making chains, C<auto>. Such C<auto> actions will be run after any
-C<begin>, but before your action is processed. Unlike the other
-built-ins, C<auto> actions I<do not> override each other; they will be
-called in turn, starting with the application class and going through to
-the I<most> specific class. I<This is the reverse of the order in which
-the normal built-ins override each other>.
-
-Here are some examples of the order in which the various built-ins
-would be called:
-
-=over 4
-
-=item for a request for C</foo/foo>
-
-  MyApp::begin
-  MyApp::auto
-  MyApp::Controller::Foo::default # in the absence of MyApp::Controller::Foo::Foo
-  MyApp::end
-
-=item for a request for C</foo/bar/foo>
+=item * L<Catalyst::Config>
 
-  MyApp::Controller::Foo::Bar::begin
-  MyApp::auto
-  MyApp::Controller::Foo::auto
-  MyApp::Controller::Foo::Bar::auto
-  MyApp::Controller::Foo::Bar::default # for MyApp::Controller::Foo::Bar::foo
-  MyApp::Controller::Foo::Bar::end
+    $c->config
+    $c->config->root;
+    $c->config->name;
 
-=back
+=item * L<Catalyst::Log>
 
-The C<auto> action is also distinguished by the fact that you can break
-out of the processing chain by returning 0. If an C<auto> action returns
-0, any remaining actions will be skipped, except for C<end>. So, for the
-request above, if the first auto returns false, the chain would look
-like this:
+    $c->log
+    $c->log->debug('Something happened');
+    $c->log->info('Something you should know');
 
-=over 4
+=item * B<Stash>
 
-=item for a request for C</foo/bar/foo> where first C<auto> returns
-false
+    $c->stash
+    $c->stash->{foo} = 'bar';
+    $c->stash->{baz} = {baz => 'qox'};
+    $c->stash->{fred} = [qw/wilma pebbles/];
 
-  MyApp::Controller::Foo::Bar::begin
-  MyApp::auto
-  MyApp::Controller::Foo::Bar::end
+and so on.
 
 =back
 
-An example of why one might use this is an authentication action: you
-could set up a C<auto> action to handle authentication in your
-application class (which will always be called first), and if
-authentication fails, returning 0 would skip any remaining methods
-for that URL.
-
-B<Note:> Looking at it another way, C<auto> actions have to return a
-true value to continue processing! You can also C<die> in the auto
-action; in that case, the request will go straight to the finalize
-stage, without processing further actions.
-
-=head4 URL Path Handling
-
-You can pass variable arguments as part of the URL path, separated with 
-forward slashes (/). If the action is a Regex or LocalRegex, the '$' anchor 
-must be used. For example, suppose you want to handle C</foo/$bar/$baz>, 
-where C<$bar> and C<$baz> may vary:
-
-    sub foo : Regex('^foo$') { my ($self, $context, $bar, $baz) = @_; }
-
-But what if you also defined actions for C</foo/boo> and C</foo/boo/hoo>?
-
-    sub boo : Path('foo/boo') { .. }
-    sub hoo : Path('foo/boo/hoo') { .. }
-
-Catalyst matches actions in most specific to least specific order:
-
-    /foo/boo/hoo
-    /foo/boo
-    /foo # might be /foo/bar/baz but won't be /foo/boo/hoo
-
-So Catalyst would never mistakenly dispatch the first two URLs to the
-'^foo$' action.
-
-If a Regex or LocalRegex action doesn't use the '$' anchor, the action will 
-still match a URL containing arguments, however the arguments won't be 
-available via C<@_>.
-
-=head4 Parameter Processing
-
-Parameters passed in the URL query string are handled with methods in
-the L<Catalyst::Request> class. The C<param> method is functionally
-equivalent to the C<param> method of C<CGI.pm> and can be used in
-modules that require this.
-
-    # http://localhost:3000/catalog/view/?category=hardware&page=3
-    my $category = $c->req->param('category');
-    my $current_page = $c->req->param('page') || 1;
-
-    # multiple values for single parameter name
-    my @values = $c->req->param('scrolling_list');         
-
-    # DFV requires a CGI.pm-like input hash
-    my $results = Data::FormValidator->check($c->req->params, \%dfv_profile);
-
-=head3 Flow Control
-
-You control the application flow with the C<forward> method, which
-accepts the key of an action to execute. This can be an action in the
-same or another Catalyst controller, or a Class name, optionally
-followed by a method name. After a C<forward>, the control flow will
-return to the method from which the C<forward> was issued.
-
-A C<forward> is similar to a method call. The main differences are that
-it wraps the call in an C<eval> to allow exception handling; it
-automatically passes along the context object (C<$c> or C<$context>);
-and it allows profiling of each call (displayed in the log with
-debugging enabled).
+The last of these, the stash, is a universal hash for sharing data among
+application components. For an example, we return to our 'hello' action:
 
     sub hello : Global {
         my ( $self, $c ) = @_;
         $c->stash->{message} = 'Hello World!';
-        $c->forward('check_message'); # $c is automatically included
-    }
-
-    sub check_message : Private {
-        my ( $self, $c ) = @_;
-        return unless $c->stash->{message};
         $c->forward('show_message');
     }
 
@@ -702,406 +660,452 @@ debugging enabled).
         $c->res->body( $c->stash->{message} );
     }
 
-A C<forward> does not create a new request, so your request object
-(C<$c-E<gt>req>) will remain unchanged. This is a key difference between
-using C<forward> and issuing a redirect.
-
-You can pass new arguments to a C<forward> by adding them
-in an anonymous array. In this case C<$c-E<gt>req-E<gt>args>
-will be changed for the duration of the C<forward> only; upon
-return, the original value of C<$c-E<gt>req-E<gt>args> will
-be reset.
+Note that the stash should be used only for passing data in an
+individual request cycle; it gets cleared at a new request. If you need
+to maintain persistent data, use a session. See
+L<Catalyst::Plugin::Session> for a comprehensive set of
+Catalyst-friendly session-handling tools.
 
-    sub hello : Global {
-        my ( $self, $c ) = @_;
-        $c->stash->{message} = 'Hello World!';
-        $c->forward('check_message',[qw/test1/]);
-        # now $c->req->args is back to what it was before
-    }
+=head3 Actions
 
-    sub check_message : Private {
-        my ( $self, $c ) = @_;
-        my $first_argument = $c->req->args->[0]; # now = 'test1'
-        # do something...
-    }
+A Catalyst controller is defined by its actions. An action is a
+subroutine with a special attribute. You've already seen some examples
+of actions in this document. The URL (for example
+http://localhost.3000/foo/bar) consists of two parts, the base
+(http://localhost:3000/ in this example) and the path (foo/bar).  Please
+note that the trailing slash after the hostname[:port] always belongs to
+base and not to the action.
 
-As you can see from these examples, you can just use the method name as
-long as you are referring to methods in the same controller. If you want
-to forward to a method in another controller, or the main application,
-you will have to refer to the method by absolute path.
+=over 4
 
-  $c->forward('/my/controller/action');
-  $c->forward('/default'); # calls default in main application
+=item * B<Application Wide Actions>
 
-Here are some examples of how to forward to classes and methods.
+Actions which are called at the root level of the application
+(e.g. http://localhost:3000/ ) go in MyApp::Controller::Root, like
+this:
 
-    sub hello : Global {
-        my ( $self, $c ) = @_;
-        $c->forward(qw/MyApp::Model::Hello say_hello/);
+    package MyApp::Controller::Root;
+    use base 'Catalyst::Controller';
+    # Sets the actions in this controller to be registered with no prefix
+    # so they function identically to actions created in MyApp.pm
+    __PACKAGE__->config->{namespace} = '';
+    sub default : Private {
+        my ( $self, $context ) = @_;
+        $context->response->body('Catalyst rocks!');
     }
+    1;
 
-    sub bye : Global {
-        my ( $self, $c ) = @_;
-        $c->forward('MyApp::Model::Hello'); # no method: will try 'process'
-    }
+=back
 
-    package MyApp::Model::Hello;
+=head4 Action types
 
-    sub say_hello {
-        my ( $self, $c ) = @_;
-        $c->res->body('Hello World!');
-    }
+Catalyst supports several types of actions:
 
-    sub process {
-        my ( $self, $c ) = @_;
-        $c->res->body('Goodbye World!');
-    }
+=over 4
 
-Note that C<forward> returns to the calling action and continues
-processing after the action finishes. If you want all further processing
-in the calling action to stop, use C<detach> instead, which will execute
-the C<detach>ed action and not return to the calling sub. In both cases,
-Catalyst will automatically try to call process() if you omit the
-method.
+=item * B<Literal> (B<Path> actions)
 
-=head3 Components
+    package MyApp::Controller::My::Controller;
+    sub bar : Path('foo/bar') { }
 
-Catalyst has an uncommonly flexible component system. You can define as
-many L</Models>, L</Views>, and L</Controllers> as you like.
+Literal C<Path> actions will act relative to their current
+namespace. The above example matches only
+http://localhost:3000/my/controller/foo/bar. If you start your path with
+a forward slash, it will match from the root. Example:
 
-All components must inherit from L<Catalyst::Base>, which provides a
-simple class structure and some common class methods like C<config> and
-C<new> (constructor).
+    package MyApp::Controller::My::Controller;
+    sub bar : Path('/foo/bar') { }
 
-    package MyApp::Controller::Catalog;
+Matches only http://localhost:3000/foo/bar.
 
-    use strict;
-    use base 'Catalyst::Base';
+    package MyApp::Controller::My::Controller;
+    sub bar : Path { }
 
-    __PACKAGE__->config( foo => 'bar' );
+By leaving the C<Path> definition empty, it will match on the namespace
+root. The above code matches http://localhost:3000/my/controller.
 
-    1;
+=item * B<Regex>
 
-You don't have to C<use> or otherwise register Models, Views, and
-Controllers.  Catalyst automatically discovers and instantiates them
-when you call C<setup> in the main application. All you need to do is
-put them in directories named for each Component type. Notice that you
-can use a terse alias for each one.
+    sub bar : Regex('^item(\d+)/order(\d+)$') { }
 
-=over 4
+Matches any URL that matches the pattern in the action key, e.g.
+http://localhost:3000/item23/order42. The '' around the regexp is
+optional, but perltidy likes it. :)
 
-=item * B<MyApp/Model/> 
+Regex matches act globally, i.e. without reference to the namespace from
+which it is called, so that a C<bar> method in the
+C<MyApp::Controller::Catalog::Order::Process> namespace won't match any
+form of C<bar>, C<Catalog>, C<Order>, or C<Process> unless you
+explicitly put this in the regex. To achieve the above, you should
+consider using a C<LocalRegex> action.
 
-=item * B<MyApp/M/>
+=item * B<LocalRegex>
 
-=item * B<MyApp/View/>
+    sub bar : LocalRegex('^widget(\d+)$') { }
 
-=item * B<MyApp/V/>
+LocalRegex actions act locally. If you were to use C<bar> in
+C<MyApp::Controller::Catalog>, the above example would match urls like
+http://localhost:3000/catalog/widget23.
 
-=item * B<MyApp/Controller/>
+If you omit the "C<^>" from your regex, then it will match any depth
+from the controller and not immediately off of the controller name. The
+following example differs from the above code in that it will match
+http://localhost:3000/catalog/foo/widget23 as well.
 
-=item * B<MyApp/C/>
+    package MyApp::Controller::Catalog;
+    sub bar : LocalRegex('widget(\d+)$') { }
 
-=back
+For both LocalRegex and Regex actions, if you use capturing parentheses
+to extract values within the matching URL, those values are available in
+the C<$c-E<gt>req-E<gt>captures> array. In the above example, "widget23"
+would capture "23" in the above example, and
+C<$c-E<gt>req-E<gt>captures-E<gt>[0]> would be "23". If you want to pass
+arguments at the end of your URL, you must use regex action keys. See
+L</URL Path Handling> below.
 
-In older versions of Catalyst, the recommended practice (and the one
-automatically created by helper scripts) was to name the directories
-C<M/>, C<V/>, and C<C/>. Though these still work, we now recommend
-the use of the full names.
+=item * B<Top-level> (B<Global>)
 
-=head4 Views
+    package MyApp::Controller::Foo;
+    sub foo : Global { }
 
-To show how to define views, we'll use an already-existing base class for the
-L<Template Toolkit|Template>, L<Catalyst::View::TT>. All we need to do is
-inherit from this class:
+Matches http://localhost:3000/foo. The function name is mapped
+directly to the application base.  You can provide an equivalent
+function in this case  by doing the following:
 
-    package MyApp::View::TT;
+    package MyApp::Controller::Root
+    sub foo : Local { }
 
-    use strict;
-    use base 'Catalyst::View::TT';
+=item * B<Namespace-Prefixed> (B<Local>)
 
-    1;
+    package MyApp::Controller::My::Controller; 
+    sub foo : Local { }
 
-(You can also generate this automatically by using the helper script:
+Matches http://localhost:3000/my/controller/foo. 
 
-    script/myapp_create.pl view TT TT
+This action type indicates that the matching URL must be prefixed with a
+modified form of the component's class (package) name. This modified
+class name excludes the parts that have a pre-defined meaning in
+Catalyst ("MyApp::Controller" in the above example), replaces "::" with
+"/", and converts the name to lower case.  See L</Components> for a full
+explanation of the pre-defined meaning of Catalyst component class
+names.
 
-where the first C<TT> tells the script that the name of the view should
-be C<TT>, and the second that it should be a Template Toolkit view.)
+=item * B<Chained>
 
-This gives us a process() method and we can now just do
-$c->forward('MyApp::View::TT') to render our templates. The base class
-makes process() implicit, so we don't have to say
-C<$c-E<gt>forward(qw/MyApp::View::TT process/)>.
+Catalyst also provides a method to build and dispatch chains of actions,
+like
 
-    sub hello : Global {
-        my ( $self, $c ) = @_;
-        $c->stash->{template} = 'hello.tt';
+    sub catalog : Chained : CaptureArgs(1) {
+        my ( $self, $c, $arg ) = @_;
+        ...
     }
 
-    sub end : Private {
-        my ( $self, $c ) = @_;
-        $c->forward('MyApp::View::TT');
+    sub item : Chained('catalog') : Args(1) {
+        my ( $self, $c, $arg ) = @_;
+        ...
     }
 
-You normally render templates at the end of a request, so it's a perfect
-use for the global C<end> action.
+to handle a C</catalog/*/item/*> path. For extensive information about this
+dispatch type, please see L<Catalyst::DispatchType::Chained>.
 
-In practice, however, you would use a default C<end> action as supplied
-by L<Catalyst::Action::RenderView>.
+=item * B<Private>
 
-Also, be sure to put the template under the directory specified in
-C<$c-E<gt>config-E<gt>{root}>, or you'll end up looking at the debug
-screen.
+    sub foo : Private { }
 
-=head4 Models
+Matches no URL, and cannot be executed by requesting a URL that
+corresponds to the action key. Private actions can be executed only
+inside a Catalyst application, by calling the C<forward> method:
 
-To show how to define models, again we'll use an already-existing base
-class, this time for L<DBIx::Class>: L<Catalyst::Model::DBIC::Schema>.
-We'll also need L<DBIx::Class::Schema::Loader>.
+    $c->forward('foo');
 
-But first, we need a database.
+See L</Flow Control> for a full explanation of C<forward>. Note that, as
+discussed there, when forwarding from another component, you must use
+the absolute path to the method, so that a private C<bar> method in your
+C<MyApp::Controller::Catalog::Order::Process> controller must, if called
+from elsewhere, be reached with
+C<$c-E<gt>forward('/catalog/order/process/bar')>.
 
-    -- myapp.sql
-    CREATE TABLE foo (
-        id INTEGER PRIMARY KEY,
-        data TEXT
-    );
+=item * B<Args>
 
-    CREATE TABLE bar (
-        id INTEGER PRIMARY KEY,
-        foo INTEGER REFERENCES foo,
-        data TEXT
-    );
+Args is not an action type per se, but an action modifier - it adds a
+match restriction to any action it's provided to, requiring only as many
+path parts as are specified for the action to be valid - for example in
+MyApp::Controller::Foo,
 
-    INSERT INTO foo (data) VALUES ('TEST!');
+  sub bar :Local
 
+would match any URL starting /foo/bar/. To restrict this you can do
 
-    % sqlite /tmp/myapp.db < myapp.sql
+  sub bar :Local :Args(1)
 
-Now we can create a DBIC::SchemaLoader component for this database.
+to only match /foo/bar/*/
 
-    script/myapp_create.pl model DBIC DBIC::SchemaLoader 'dbi:SQLite:/tmp/myapp.db'
+=back
 
-L<DBIx::Class::Schema::Loader> automatically loads table layouts and
-relationships. Use the stash to pass data to your templates.
+B<Note:> After seeing these examples, you probably wonder what the point
+is of defining names for regex and path actions. Every public action is
+also a private one, so you have one unified way of addressing components
+in your C<forward>s.
 
-We add the following to MyApp/Controller/Root.pm
+=head4 Built-in Private Actions
 
-    sub view : Global {
-        my ( $self, $c, $id ) = @_;
-        
-        $c->stash->{item} = $c->model('DBIC::Foo')->find($id);
-    }
+In response to specific application states, Catalyst will automatically
+call these built-in private actions in your application class:
 
-    1;
-    
-    sub end : Private {
-        my ( $self, $c ) = @_;
-        
-        $c->stash->{template} ||= 'index.tt';
-        $c->forward( $c->view('TT') );
-    }
+=over 4
 
-We then create a new template file "root/index.tt" containing:
+=item * B<default : Private>
 
-    The Id's data is [% item.data %]
+Called when no other action matches. Could be used, for example, for
+displaying a generic frontpage for the main app, or an error page for
+individual controllers.
 
-Models do not have to be part of your Catalyst application; you
-can always call an outside module that serves as your Model:
+If C<default> isn't acting how you would expect, look at using a
+L</Literal> C<Path> action (with an empty path string). The difference
+is that C<Path> takes arguments relative from the namespace and
+C<default> I<always> takes arguments relative from the root, regardless
+of what controller it's in. Indeed, this is now the recommended way of
+handling default situations; the C<default> private controller should
+be considered deprecated.
 
-    # in a Controller
-    sub list : Local {
-      my ( $self, $c ) = @_;
-      
-      $c->stash->{template} = 'list.tt';
-      
-      use Some::Outside::Database::Module;
-      my @records = Some::Outside::Database::Module->search({
-        artist => 'Led Zeppelin',
-        });
-      
-      $c->stash->{records} = \@records;
-    }
+=item * B<index : Private>
+
+C<index> is much like C<default> except that it takes no arguments
+and it is weighted slightly higher in the matching process. It is
+useful as a static entry point to a controller, e.g. to have a static
+welcome page. Note that it's also weighted higher than Path.
+
+=item * B<begin : Private>
+
+Called at the beginning of a request, before any matching actions are
+called.
+
+=item * B<end : Private>
+
+Called at the end of a request, after all matching actions are called.
+
+=back
+
+=head4 Built-in actions in controllers/autochaining
+
+    Package MyApp::Controller::Foo;
+    sub begin : Private { }
+    sub default : Private { }
+    sub auto : Private { }
+
+You can define built-in private actions within your controllers as
+well. The actions will override the ones in less-specific controllers,
+or your application class. In other words, for each of the three
+built-in private actions, only one will be run in any request
+cycle. Thus, if C<MyApp::Controller::Catalog::begin> exists, it will be
+run in place of C<MyApp::begin> if you're in the C<catalog> namespace,
+and C<MyApp::Controller::Catalog::Order::begin> would override this in
+turn.
 
-But by using a Model that is part of your Catalyst application, you gain
-several things: you don't have to C<use> each component, Catalyst will
-find and load it automatically at compile-time; you can C<forward> to
-the module, which can only be done to Catalyst components; and only
-Catalyst components can be fetched with
-C<$c-E<gt>model('SomeModel')>.
+=item * B<auto : Private>
 
-Happily, since many people have existing Model classes that they
-would like to use with Catalyst (or, conversely, they want to
-write Catalyst models that can be used outside of Catalyst, e.g.
-in a cron job), it's trivial to write a simple component in
-Catalyst that slurps in an outside Model:
+In addition to the normal built-in actions, you have a special action
+for making chains, C<auto>. Such C<auto> actions will be run after any
+C<begin>, but before your action is processed. Unlike the other
+built-ins, C<auto> actions I<do not> override each other; they will be
+called in turn, starting with the application class and going through to
+the I<most> specific class. I<This is the reverse of the order in which
+the normal built-ins override each other>.
 
-    package MyApp::Model::DB;
-    use base qw/Catalyst::Model::DBIC::Schema/;
-    __PACKAGE__->config(
-        schema_class => 'Some::DBIC::Schema',
-        connect_info => ['dbi:SQLite:foo.db', '', '', {AutoCommit=>1}]
-    );
-    1;
+Here are some examples of the order in which the various built-ins
+would be called:
 
-and that's it! Now C<Some::DBIC::Schema> is part of your
-Cat app as C<MyApp::Model::DB>.
+=over 4
 
-=head4 Controllers
+=item for a request for C</foo/foo>
 
-Multiple controllers are a good way to separate logical domains of your
-application.
+  MyApp::begin
+  MyApp::auto
+  MyApp::Controller::Foo::default # in the absence of MyApp::Controller::Foo::Foo
+  MyApp::end
 
-    package MyApp::Controller::Login;
+=item for a request for C</foo/bar/foo>
 
-    use base qw/Catalyst::Controller/;
+  MyApp::Controller::Foo::Bar::begin
+  MyApp::auto
+  MyApp::Controller::Foo::auto
+  MyApp::Controller::Foo::Bar::auto
+  MyApp::Controller::Foo::Bar::default # for MyApp::Controller::Foo::Bar::foo
+  MyApp::Controller::Foo::Bar::end
 
-    sub sign_in : Path("sign-in") { }
-    sub new_password : Path("new-password") { }
-    sub sign_out : Path("sign-out") { }
+=back
 
-    package MyApp::Controller::Catalog;
+The C<auto> action is also distinguished by the fact that you can break
+out of the processing chain by returning 0. If an C<auto> action returns
+0, any remaining actions will be skipped, except for C<end>. So, for the
+request above, if the first auto returns false, the chain would look
+like this:
 
-    use base qw/Catalyst::Controller/;
+=over 4
 
-    sub view : Local { }
-    sub list : Local { }
+=item for a request for C</foo/bar/foo> where first C<auto> returns
+false
 
-    package MyApp::Controller::Cart;
+  MyApp::Controller::Foo::Bar::begin
+  MyApp::auto
+  MyApp::Controller::Foo::Bar::end
 
-    use base qw/Catalyst::Controller/;
+=back
 
-    sub add : Local { }
-    sub update : Local { }
-    sub order : Local { }
+An example of why one might use this is an authentication action: you
+could set up a C<auto> action to handle authentication in your
+application class (which will always be called first), and if
+authentication fails, returning 0 would skip any remaining methods
+for that URL.
 
-Note that you can also supply attributes via the Controller's config so long
-as you have at least one attribute on a subref to be exported (:Action is
-commonly used for this) - for example the following is equivalent to the same
-controller above
+B<Note:> Looking at it another way, C<auto> actions have to return a
+true value to continue processing! You can also C<die> in the auto
+action; in that case, the request will go straight to the finalize
+stage, without processing further actions.
 
-    package MyApp::Controller::Login;
+=head4 URL Path Handling
 
-    use base qw/Catalyst::Controller/;
+You can pass variable arguments as part of the URL path, separated with 
+forward slashes (/). If the action is a Regex or LocalRegex, the '$' anchor 
+must be used. For example, suppose you want to handle C</foo/$bar/$baz>, 
+where C<$bar> and C<$baz> may vary:
 
-    __PACKAGE__->config(
-      actions => {
-        'sign_in' => { Path => 'sign-in' },
-        'new_password' => { Path => 'new-password' },
-        'sign_out' => { Path => 'sign-out' },
-      },
-    );
+    sub foo : Regex('^foo$') { my ($self, $context, $bar, $baz) = @_; }
 
-    sub sign_in : Action { }
-    sub new_password : Action { }
-    sub sign_out : Action { }
+But what if you also defined actions for C</foo/boo> and C</foo/boo/hoo>?
 
-=head3 Models
+    sub boo : Path('foo/boo') { .. }
+    sub hoo : Path('foo/boo/hoo') { .. }
 
-Models are providers of data. This data could come from anywhere - a
-search engine index, a database table, etc. Typically the data source
-does not have much to do with web applications or Catalyst - it could be
-used to write an offline report generator or a command line tool just
-the same.
+Catalyst matches actions in most specific to least specific order:
 
-The common approach to writing a Catalyst-style model for your
-application is wrapping a generic model (e.g. L<DBIx::Class::Schema>, a
-bunch of XMLs, or anything really) with an object that contains
-configuration data, convenience methods, and so forth.
+    /foo/boo/hoo
+    /foo/boo
+    /foo # might be /foo/bar/baz but won't be /foo/boo/hoo
 
-#### editor: move this part to =head3 Components somehow, right after this
-#### section - this will require deeply rephrasing this paragraph.
+So Catalyst would never mistakenly dispatch the first two URLs to the
+'^foo$' action.
 
-Technically, within Catalyst a model is a B<component> - an instance of
-the model's class belonging to the application. It is important to
-stress that the lifetime of these objects is per application, not per
-request.
+If a Regex or LocalRegex action doesn't use the '$' anchor, the action will 
+still match a URL containing arguments, however the arguments won't be 
+available via C<@_>.
 
-While the model base class (L<Catalyst::Model>) provides things like
-C<config> and stuff to better integrate the model into the application,
-sometimes this is not enough, and the model requires access to C<$c>
-itself.
+=head4 Parameter Processing
 
-Situations where this need might arise include:
+Parameters passed in the URL query string are handled with methods in
+the L<Catalyst::Request> class. The C<param> method is functionally
+equivalent to the C<param> method of C<CGI.pm> and can be used in
+modules that require this.
 
-=over 4
+    # http://localhost:3000/catalog/view/?category=hardware&page=3
+    my $category = $c->req->param('category');
+    my $current_page = $c->req->param('page') || 1;
 
-=item *
+    # multiple values for single parameter name
+    my @values = $c->req->param('scrolling_list');         
 
-Interacting with another model
+    # DFV requires a CGI.pm-like input hash
+    my $results = Data::FormValidator->check($c->req->params, \%dfv_profile);
 
-=item *
+=head3 Flow Control
 
-Using per-request data to control behavior
+You control the application flow with the C<forward> method, which
+accepts the key of an action to execute. This can be an action in the
+same or another Catalyst controller, or a Class name, optionally
+followed by a method name. After a C<forward>, the control flow will
+return to the method from which the C<forward> was issued.
 
-=item *
+A C<forward> is similar to a method call. The main differences are that
+it wraps the call in an C<eval> to allow exception handling; it
+automatically passes along the context object (C<$c> or C<$context>);
+and it allows profiling of each call (displayed in the log with
+debugging enabled).
 
-Using plugins in (for example L<Catalyst::Plugin::Cache>).
+    sub hello : Global {
+        my ( $self, $c ) = @_;
+        $c->stash->{message} = 'Hello World!';
+        $c->forward('check_message'); # $c is automatically included
+    }
 
-=back
+    sub check_message : Private {
+        my ( $self, $c ) = @_;
+        return unless $c->stash->{message};
+        $c->forward('show_message');
+    }
 
-From a style perspective usually it's bad to make your model "too smart"
-about things - it should worry about business logic and leave the
-integration details to the controllers. If, however, you find that it
-does not make sense at all to use an auxillary controller around the
-model, and the model's need to access C<$c> cannot be sidestepped, there
-exists a power tool called C<ACCEPT_CONTEXT>.
+    sub show_message : Private {
+        my ( $self, $c ) = @_;
+        $c->res->body( $c->stash->{message} );
+    }
 
-#### editor note: this part is "generic" - it also applies to views and
-#### controllers.
+A C<forward> does not create a new request, so your request object
+(C<$c-E<gt>req>) will remain unchanged. This is a key difference between
+using C<forward> and issuing a redirect.
 
-=head3 ACCEPT_CONTEXT
+You can pass new arguments to a C<forward> by adding them
+in an anonymous array. In this case C<$c-E<gt>req-E<gt>args>
+will be changed for the duration of the C<forward> only; upon
+return, the original value of C<$c-E<gt>req-E<gt>args> will
+be reset.
 
-Whenever you call $c->component("Foo") you get back an object - the
-instance of the model. If the component supports the C<ACCEPT_CONTEXT>
-method instead of returning the model itself, the return value of C<<
-$model->ACCEPT_CONTEXT( $c ) >> will be used.
+    sub hello : Global {
+        my ( $self, $c ) = @_;
+        $c->stash->{message} = 'Hello World!';
+        $c->forward('check_message',[qw/test1/]);
+        # now $c->req->args is back to what it was before
+    }
 
-This means that whenever your model/view/controller needs to talk to C<$c> it
-gets a chance to do this when it's needed.
+    sub check_message : Private {
+        my ( $self, $c ) = @_;
+        my $first_argument = $c->req->args->[0]; # now = 'test1'
+        # do something...
+    }
 
-A typical C<ACCEPT_CONTEXT> method will either clone the model and return one
-with the context object set, or it will return a thin wrapper that contains
-C<$c> and delegates to the per-application model object.
+As you can see from these examples, you can just use the method name as
+long as you are referring to methods in the same controller. If you want
+to forward to a method in another controller, or the main application,
+you will have to refer to the method by absolute path.
 
-A typical C<ACCEPT_CONTEXT> method could look like this:
+  $c->forward('/my/controller/action');
+  $c->forward('/default'); # calls default in main application
 
-    sub ACCEPT_CONTEXT {
-      my ( $self, $c, @extra_arguments ) = @_;
-      bless { %$self, c => $c }, ref($self);
-    }
+Here are some examples of how to forward to classes and methods.
 
-effectively treating $self as a B<prototype object> that gets a new parameter.
-C<@extra_arguments> comes from any trailing arguments to
-C<< $c->component( $bah, @extra_arguments ) >> (or C<< $c->model(...) >>,
-C<< $c->view(...) >> etc).
+    sub hello : Global {
+        my ( $self, $c ) = @_;
+        $c->forward(qw/MyApp::Model::Hello say_hello/);
+    }
 
-The life time of this value is B<per usage>, and not per request. To make this
-per request you can use the following technique:
+    sub bye : Global {
+        my ( $self, $c ) = @_;
+        $c->forward('MyApp::Model::Hello'); # no method: will try 'process'
+    }
 
-Add a field to C<$c>, like C<my_model_instance>. Then write your
-C<ACCEPT_CONTEXT> method to look like this:
+    package MyApp::Model::Hello;
 
-    sub ACCEPT_CONTEXT {
-      my ( $self, $c ) = @_;
+    sub say_hello {
+        my ( $self, $c ) = @_;
+        $c->res->body('Hello World!');
+    }
 
-      if ( my $per_request = $c->my_model_instance ) {
-        return $per_request;
-      } else {
-        my $new_instance = bless { %$self, c => $c }, ref($self);
-        Scalar::Util::weaken($new_instance->{c}); # or we have a circular reference
-        $c->my_model_instance( $new_instance );
-        return $new_instance;
-      }
+    sub process {
+        my ( $self, $c ) = @_;
+        $c->res->body('Goodbye World!');
     }
 
+Note that C<forward> returns to the calling action and continues
+processing after the action finishes. If you want all further processing
+in the calling action to stop, use C<detach> instead, which will execute
+the C<detach>ed action and not return to the calling sub. In both cases,
+Catalyst will automatically try to call process() if you omit the
+method.
+
 
 =head3 Testing
 
-Catalyst has a built-in http server for testing. (Later, you can easily
-use a more powerful server, e.g. Apache/mod_perl or FastCGI, in a
-production environment.)
+Catalyst has a built-in http server for testing or local
+deployment. (Later, you can easily use a more powerful server, for
+example Apache/mod_perl or FastCGI, in a production environment.)
 
 Start your application on the command line...
 
@@ -1113,15 +1117,32 @@ You can also do it all from the command line:
 
     script/myapp_test.pl http://localhost/
 
+Catalyst has a number of tools for actual regression testing of
+applications. The helper scripts will automatically generate basic tests
+that can be extended as you develop your project. To write your own
+comprehensive test scripts, L<Test::WWW::Mechanize::Catalyst> is an
+invaluable tool.
+
+For more testing ideas, see L<Catalyst::Manual::Tutorial::Testing>.
+
 Have fun!
 
+=head1 SEE ALSO
+
+=item * L<Catalyst::Manual::About>
+
+=item * L<Catalyst::Manual::Tutorial>
+
+=item * L<Catalyst>
+
 =head1 SUPPORT
 
 IRC:
 
     Join #catalyst on irc.perl.org.
+    Join #catalyst-dev on irc.perl.org to help with development.
 
-Mailing-lists:
+Mailing lists:
 
     http://lists.rawmode.org/mailman/listinfo/catalyst
     http://lists.rawmode.org/mailman/listinfo/catalyst-dev
@@ -1138,5 +1159,5 @@ Yuval Kogman, C<nothingmuch@woobling.org>
 
 =head1 COPYRIGHT
 
-This program is free software, you can redistribute it and/or modify it
+This program is free software. You can redistribute it and/or modify it
 under the same terms as Perl itself.