NAME

Router::PathInfo::Controller provides a mapping PATH_INFO to controllers.

SYNOPSIS

    # create instance
    my $r = Router::PathInfo::Controller->new();
    
    # describe connect
    $r->add_rule(connect => '/foo/:enum(bar|baz)/:any', action => ['some','bar']);
    
    # prepare arguments (this action to prepare $env hidden from you in the module Router::PathInfo)
    my $env = {PATH_INFO => '/foo/baz/bar', REQUEST_METHOD => 'GET'};
    my @segment = split '/', $env->{PATH_INFO}, -1; 
    shift @segment;
    $env->{'psgix.tmp.RouterPathInfo'} = {
        segments => [@segment],
        depth => scalar @segment 
    };
    
    # match
    my $res = $r->match($env);  
	#  $res =  HASH(0x93d74d8)
	#   'action' => ARRAY(0x99294e8)
	#      0  'some'
	#      1  'bar'
	#   'segment' => ARRAY(0x93d8038)
	#      0  'baz'
	#      1  'bar'
	#   'type' => 'controller'

    # or $res may by undef

DESCRIPTION

Router::PathInfo::Controller is used for matching sets of trees. Therefore, search matching is faster and more efficient, than a simple enumeration of regular expressions to search for a suitable result.

In the descriptions of 'connect' by adding rules, you can use these tokens:

:any                                 - match with any segment
:re(...some regular expression...)   - match with the specified regular expression
:enum(...|...)                       - match with a segment from the set

and sub-attribute for rules

:name(...)

For example

   '/foo/:name(some_name)bar/:any'
   '/foo/:re(^\d{4}\w{4}$)/:name(my_token):any'
   '/:enum(foo|bar|baz)/:re(^\d{4}\w{4}$)/:any'

All descriptions of the segments have a certain weight. Thus, the description :enum has the greatest weight, a description of :re weighs even less. Weakest coincidence is :any.

For all descriptions 'connect' using these tokens in the match will be returned to a special key 'segment' in which stores a list of all segments PATH_INFO they are responsible.

An important point: description 'connect' dominates over http method. Example:

$r->add_rule(connect => '/foo/:any/baz', action => 'one', methods => ['GET','DELETE']);
$r->add_rule(connect => '/foo/bar/:any', action => 'two');

for '/foo/bar/baz' with GET -> 'two'

In action you can pass any value: object, arrayref, hashref or a scalar.

METHODS

new()

Simple constructor

add_rule(connect => $describe_connect, action => $action_token[, methods => $arrayref, match_callback => $code_ref])

Add your description to match.

'methods' - arrayref of items GET, POST, PUT, OPTIONS, DELETE, HEAD

'match_callback' - coderef is called after match found. It takes two arguments: a match found and heshref passed parameters (see method match). Example:

$r->add_rule(
    connect => '/foo/:enum(bar|baz)/:any', 
    action => ['any thing'], 
    methods => ['POST'], 
    match_callback => sub {
        my ($match, $env) = @_;
        
        if ($env->{...} == ..) {
            # $match->{action}->[0] eq 'any thing'
            return $match;
        } else {
            return {
                type  => 'error',
                code => 403,
                desc  => 'blah-blah'   
            }; 
        }
    }
);

match({REQUEST_METHOD => ..., 'psgix.tmp.RouterPathInfo' => ...})

Search match. See SYNOPSIS.

If a match is found, it returns hashref:

{
    type => 'controller',
    action => $action,
    name_segments => $arrayref
}

Otherwise, undef.

SEE ALSO

Router::PathInfo, Router::PathInfo::Static

AUTHOR

mr.Rico <catamoose at yandex.ru>