=pod =head1 NAME Maypole::Manual::Workflow - Maypole's Request Workflow =head1 DESCRIPTION This chapter describes the progress of a request through Maypole. An application based on C provides an Apache or CGI handler, and eventually delivers a page. This document explains how that happens, and how to influence it. We'll use the C project as our example. Here's a diagram that gives an overview: config $h | Maypole $r Apache::Request | +---- $r->get_request ---+ $ar | | $r->parse_location | $r->is_applicable | BeerDB::Beer $r->call_authenticate ->authenticate ------------+------------ $r->authenticate | $r->additional_data | $r->model_class->process($r) | $r->view_object->process($r) =head2 Initialize class When the first request comes in, the application class will call its own C method, inherited from L. This creates a new view object. =head2 Construction Once we have initialized, the handler obtains the configuration for your class, and puts it into a new object. We'll call this a request I for the purposes of this document; it will be a new C object. =head2 Getting the request Next, the handler calls C on the new object to have it store a copy of the C. Of course, if you're not using Apache, you might want to subclass this method to return something that looks like an C object, and possibly also subclass the next stage too to get more control over what methods are called on your C-lookalike. C is expected to put the object in the C slot of the request object. =head2 Handling the URL Typically, the details of the request will be passed in the URL. This is done with the C method, which is expected to populate several slots of the request object. First, C and C should be populated with the name of the table and the action parts of the URL. Any other arguments should be placed in a listref in the C slot, and GET and POST parameters should be arranged into a hash and placed in the C and C slots, respectively. Some people may not like the idea of passing everything around in the URL; this is the method to override for you. Of course, you'll also need to provide your own default templates to construct links using your preferred format. =head2 Is this an applicable URL? Next, the C method works out if this is actually something that C should care about - whether the class exists in the application, whether it supports the given action, and so on. The action is "supported" if it exists in the model class (or its ancestors) and is marked with the C<:Exported> attribute; this stops web users from firing off random subroutines in your code. This should return an Apache status code; C if the request should proceed, C if it should be passed on to the default handlers, or whatever other codes for permissions problems. =head2 Are we allowed to do this? We then look for an appropriate C method to call; first it will try calling the C method of the model class, or, if that does not exist, the C method on itself. By default, this allows access to everyone for everything. Your C methods must return an Apache status code: C or C. These codes are defined by the L module, which is automatically used by your application. =head2 Add any additional data to the request You can write an C method to do any additional fiddling with the request object before it is despatched. Specifically, it allows you to add to the C slot, which is a hash of arguments to be added to the template, like this: sub additional_data { my $self = shift; $self->{template_args}{answer} = 42; } which adds a new template variable C with the value 42. =head2 Ask model for widget set Asking the model class to C the current request allows it to do any work it needs for the given command, and populate the C and C