SYNOPSIS
# In "WebApp.pm"...
package WebApp;
use base 'CGI::Application';
use CGI::Application::Plugin::ActionDispatch;
sub do_stuff : Path('do/stuff') { ... }
sub do_more_stuff : Regex('^/do/more/stuff\/?$') { ... }
sub do_something_else : Regex('do/something/else/(\w+)/(\d+)$') { ... }
DESCRIPTION
CGI::Application::Plugin::ActionDispatch adds attribute based support for parsing the PATH_INFO of the incoming request. For those who are familiar with Catalyst. The interface works very similar.This plugin is plug and play and shouldn't interrupt the default behavior of CGI::Application.
CAVEATS
Be aware though, this plugin will not likely work with other modules that use attributes.This module should work with mod_perl. It however has not be thoroughly tested as such. If you have used it with mod_perl please e-mail me with your experience.
METHODS
- action_args()
-
If using capturing parentheses in a Regex action. The captured values are
accessible using this method.
sub addElement : Regex('add/(\d+)/(\d+)') { my $self = shift; my($column, $row) = $self->action_args(); ... }
The Path action will store everything after the matched path into the action args.
# http://example.com/state/pa/philadelphia sub find_state_and_city : Path('state/') { my $self = shift; my($state, $city) = $self->action_args(); # $state == pa, $city == philadelphia ... }
ACTIONS
- Regex
-
Regex action is used for regular expression matching against PATH_INFO. If
capturing parentheses are used; the matched parameters are accesssible using
the action_args() method.
Regex('^blah/foo');
The Regex action either matches or it doesn't. There are no secrets to it.
It is important to note Regex action takes priority. It is assumed if a Path and Regex action both match. The Regex action will take priority, which may not always be the outcome of least suprise, for instance:
# http://example.com/music/the_clash sub clash : Path('/music/the_clash') {} # This is an exact match, BUT. sub the_class : Regex('/music/the_clash') {} # This takes priority. Beware.
- Path
-
The Path action is basically a shortcut for a commonly used Regex action.
# http://example.com/products/movies/2 sub show_product : Path('products/') { my $self = shift; my($category, $id) = $self->action_args(); .... }
Is basically the same thing as.
sub show_product : Regex('^/products/(\w+)/(\d+)') { my $self = shift; my($category, $id) = $self->action_args(); ... }
For those that care, the Path('products/') will be converted to the regular expression ``^/products\/?(\/.*)$''; then split('/') is run on the captured value and stored in action_args().
- Runmode
-
This action will take the method name and run a match on that.
sub foobar : Runmode {}
- Default
-
The default run mode if no match is found. Essentially the equivalent of the
start_mode() method.
sub default_mode : Default {}
EXAMPLE
In CGI::Application module:
package WebApp; use base 'CGI::Application'; use CGI::Application::Plugin::ActionDispatch; use strict; sub setup { my $self = shift; self->mode_param('test_rm'); $self->run_modes( basic_runmode => 'basic_runmode' ); } # Regular runmodes should work. sub basic_runmode { my $self = shift }
The product() runmode will match anything starting with ``/products'' in the PATH_INFO.
# http://example.com/myapp.cgi/products/this/is/optional/and/stored/in/action_args/ sub product : Path('products/') { my $self = shift; my($category, $product) = $self->action_args(); }
The music() runmode will match anything starting with ``/products/music'' in the PATH_INFO. The product() runmode also matches ``/products/music''. However since this runmode matches closer it takes priority over product().
# http://example.com/myapp.cgi/products/music/product/ sub music : Path('products/music/') { my $self = shift; my $product = $self->action_args(); ... }
This beatles() runmode will match ONLY ``/product/music/beatles'' or ``/product/music/beatles/''. Regex takes priority over Path so the previous runmodes which match this PATH_INFO are not run.
# http://example.com/myapp.cgi/products/music/beatles/ sub beatles : Regex('^/products/music/beatles\/?') { my $self = shift; ... }
AUTHOR
Jason Yates, <[email protected]>COPYRIGHT AND LICENSE
Copyright (C) 2006-2008 by Jason YatesThis library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.7 or, at your option, any later version of Perl 5 you may have available.