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{ &gt; <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

Egg::Release,

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.