The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

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>