NAME
Egg::Dispatch::Runmode - Standard subdispatch class for Egg.
SYNOPSIS
Dispatch file example.
package MYPROJECT::D;
use strict;
use MYPROJECT::D::Help;
use MYPROJECT::D::Root;
__PACKAGE__->run_modes(
_begin => \&_begin,
_default=> \&_default,
_end => \&_end,
help => {
_begin => sub {}, # The operation of '_begin' of top-level is stopped.
_end => sub {}, # The operation of '_end' of top-level is stopped.
faq => \&MYPROJECT::D::Help::faq,
},
members => {
_begin => \&MYPROJECT::D::Root::_begin,
_default=> \&MYPROJECT::D::Root::_default,
_end => \&MYPROJECT::D::Root::_end,
profile => sub {
my($self, $e)= @_;
$e->template('profile.tt');
},
},
);
__PACKAGE__->default_mode('default');
# Only when operating by CGI.
__PACKAGE__->mod_param('mode');
sub _default {
....
}
... Additionally, necessary code.
DESCRIPTION
This dispatch distributes processing based on HASH set to run_modes.
* HASH of a multiple structure is supported.
* The final attainment point must become CODE reference.
* Dispatch is concretely defined by the following styles.
package MYPROJECT::D;
use strict;
__PACKAGE__->run_modes(
front_page => sub { ... },
second_page=> {
_default => sub { ... },
sub_page => sub { ... },
},
...
);
This operates as follows.
http://domain/front_page/
=> run_modes->{front_page} is called.
http://domain/second_page/
=> run_modes->{second_page}{_default} is called.
http://domain/second_page/sub_page/
=> run_modes->{second_page}{sub_page} is called.
If '_default' is put when the key done to agree to the hierarchy under the scanning is not found, it matches it to it.
* Please make the value of '_default' CODE reference.
__PACKAGE__->run_modes(
_default=> sub { ... default code },
...
);
* The name of '_default' is revokable in the method of 'default_mode' beforehand.
__PACKAGE__->default_mode('_index');
The processing after a prior thing like Catalyst is reproduced with '_begin' and '_end' key.
* Please make the value of '_begin' and '_end' CODE reference.
__PACKAGE__->run_modes(
_begin=> sub { ... begin code },
_end => sub { ... end code },
...
);
* Please put '_begin' and '_end' that doesn't do anything when you want to stop this on the way.
HASH and the regular expression can be used for the key by using Tie::RefHash as follows. Because Tie::RefHash is conveniently used, the 'refhash' function is available.
__PACKAGE__->run_modes( refhash(
qr/member_([a-z0-9]{8})/=> refhash(
qr/([A-Z])([0-9]{7})/ => \&MYPROJECT::D::Member::id,
_default=> \&MYPROJECT::D::Member::default,
),
login=> refhash(
{ POST=> 'check' }=> sub { check code ... },
),
{ GET=> 'help' }=> sub { help code ... },
),
),
* It is sure to match it before and behind the regular expression. '^' and '$' need not be put. The thing that should be assumed to be '.+abc.+' to make it match on the way is noted.
This operates as follows.
http://domain/member_hoge/
=> &MYPROJECT::D::Member::default($dispath, $e, ['hoge']);
http://domain/member_hoge/A1234567/
=> &MYPROJECT::D::Member::id($dispath, $e, ['A', '1234567']);
* As for a rear reference for the regular expression, only the thing matched at the end can be acquired.
* A rear reference is passed to the third argument by the ARRAY reference. This value can be acquired from $e->stash->{_action_match}.
When HASH is used for the key, REQUEST_METHOD is definable POST and GET
* Even if REQUEST_METHOD is specified over two or more hierarchies, it is not significant because it scans from a top hierarchy.
This is NG.
{ GET=> 'foo' }=> {
{ POST=> 'boo' }=> sub { ... },
{ GET => 'hoge' }=> sub { ... },
},
This doesn't match to all POST requests by a hierarchical scanning of foo. Therefore, there is no thing that matches to foo->boo. Moreover, it is not necessary to specify GET with hoge. This only becomes only inefficient.
When you want to make the POST request matched to boo.
foo=> {
{ POST=> 'boo' }=> sub { ... },
{ GET => 'hoge' }=> sub { ... },
},
It is the above-mentioned and the mistake is not found in the syntax. However, this doesn't operate normally. I think that being passed to Tie::RefHash after the key to the second hierarchy progresses the character string is a problem. Therefore, the key is not recognized as HASH.
Please use 'refhash' though it is troublesome for a moment.
__PACKAGE__->run_modes=> (
foo=> refhash(
{ POST=> 'boo' }=> sub { ... },
{ GET => 'hoge' }=> sub { ... },
hoge=> refhash(
qr/regixp(...)/ => sub { ... },
qr/id(...)/ => sub { ... },
),
),
);
$e->snip can be usually used in mod_perl. Please define the parameter name to reproduce snip beforehand by the use of 'mode_param' method in usual CGI.
__PACKAGE__->mode_param('m');
__PACKAGE__->run_modes(
hoge=> {
foo=> {
baa=> sub { ... },
},
},
);
This operates as follows.
http://domain/cgi-bin/trigger.cgi?m=hoge-foo-baa
=> run_modes->{hoge}{foo}{baa} is called.
METHODS
run_modes ( HASH )
It is a method for the prior definition of the operation mode.
The reference can be used for the key by using Tie::RefHash.
package MYPROJECT::D;
use strict;
__PACKAGE__->run_modes(
.... HASH
);
default_mode ([DEFAULT_NAME]) or start_mode ([DEFAULT_NAME])
The name of the default key can be set.
__PACKAGE__->default_mode('_index');
param_name ([REQUEST_NAME]);
The parameter name to acquire the mode when moving it with usual CGI is set.
__PACKAGE__->param_name('mode');
mode_now ([NUMBER])
The character that converts an action now at the time of matched it when executing it for the modal parameter is returned.
* This is a method of utility for usual CGI.
When [NUMBER] is specified, the action to the upstairs layer of one is targeted.
action value : [qw{ foo hoge now }]
dispath->mode_now() => foo-hoge-now
dispath->mode_now(1) => foo-hoge
dispath->mode_now(2) => foo
dispath->mode_now(3) => '' # Dead letter character.
label ([NUMBER])
The label of each action hierarchy is returned by the ARRAY reference.
If the label is defined in run_modes, the label is preserved.
run_modes( refhash(
{ ANY=> 'members', label=> 'For member' }=> refhash(
{ ANY=> 'edit', label=> 'Member information edit' }=> sub { ... },
{ ANY=> 'service' label=> 'Service' }=> sub { ... },
),
) );
* Please set the action key by using 'ANY' to make it match POST and GET any.
This is useful for making Topic PATH.
my $topic= qq{ <a href="/">HOME</a> };
for (0..$#{$e->action}) {
my $path = join('/', @{$e->action}[0..$_]) || "";
my $label= $e->dispatch->label($_) || next;
$topic.= qq{ > <a href="/$path">$label</a> };
}
* When label is not defined, URI parts under the scanning are put as they are. The $e->escape_html passing might be safe.
page_title
Matched label or action key is returned.
Using it with the template is convenient.
<title><% $e->escape_html($e->dispatch->page_title) %></title>
SEE ALSO
AUTHOR
Masatoshi Mizuno <lushe@cpan.org>
COPYRIGHT
Copyright (C) 2007 by Bee Flag, Corp. <http://egg.bomcity.com/>, All Rights Reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.6 or, at your option, any later version of Perl 5 you may have available.