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

NAME

Router::Pygmy - ultrasimple path router matching paths to names and args

VERSION

version 0.05

SYNOPSIS

    use Router::Pygmy;

    my $router = Router::Pygmy->new;
    $router->add_route( 'tree/:species/branches',    'tree.branches' );
    $router->add_route( 'tree/:species/:branch',     'tree.branch' );
    $router->add_route( 'tree/:species/:branch/nut', 'tree.nut' );

    # mapping path to ($name, \@args) or  ($name, \%params)

    my ($name, $args) =  $router->match('tree/oak/branches'); # yields ('tree.branches', ['oak'] )
    my ($name, $params) = $router->match_named('tree/oak/branches'); # yields ('tree.branches', [species=>'oak']) 

    my ($name, $args) = $router->match('tree/oak/12'); # yields ('tree.branch', [ 'oak', 12 ] )
    my ($name, $params) = $router->match_named('tree/oak/12'); # yields ('tree.branch', [ species=> 'oak', branch => 12 ] )

    my ($name, $args) = $router->match('tree/oak/12/ut'); # yields ()

    # branches cannot serve as a value for :branch parameter
    my ($name, $args) = $router->match('tree/oak/branches/nut'); # yields () not ('tree.branches', ['branches'])

    # reverse routing
    #
    # mapping ($name, \%args) or ($name, \@args) to $path

    # path arguments can be \@args (positional), \%params (named) or $arg (single positional)
    my $path = $router->path_for( 'tree.branches', ['ash'] ); # yields 'tree/ash/branches' 
    my $path = $router->path_for( 'tree.branches', 'ash' ); # yields 'tree/ash/branches' 
    my $path = $router->path_for( 'tree.branches', { species => 'ash' } ); # yields 'tree/ash/branches'


    # If you supply invalid number or invalid names of args an exception is thrown
    my $path = $router->path_for( 'tree.branches', { pecies => 'ash' } );
    # throws "Invalid args for route 'tree/:species/branches', got ('pecies') expected ('species')"

    # If name cannot be found, also the error is thrown
    my $path = $router->path_for( 'tree.root', [ 'ash', 12, 3 ] );
    # throws "No route 'tree.root'"

DESCRIPTION

Router::Pygmy is a very simple straightforward router which maps paths to (name, args) and vice versa.

METHODS

new
  my $router = Router::Pygmy->new;
  my $router = Router::Pygmy->new(routes => \%hash );

a constructor

add_route($route, $name)
    $router->add_route( 'tree/:species/branches', 'tree.branches' );

Adds mapping. Both $path and $name args must be strings. The $route can contain parameter names in form of :identifier. You cannot (intentionally) have two paths leading to the same name.

match($path)
    my ($name, $args) = $router->match("tree/walnut/branches");

Maps $path to list ($name, $args) where $args is the arrayref of values of path params. Returns an empty list if no route matches.

match_named($path)
    my ($name, $args) = $router->match_named("tree/walnut/branches");

Same as match only the second element of the list is an arrayref with key value pairs [ param_name => param_value, param_name => param_value ]

path_for($name, $args)

Constructs the path for a $name

    my $path = $router->path_for("tree.branches", ["walnut"]);

The $args can be either positional, names single string or nothing (if path has no parameter)

Simplicity

Route::Pygmy is very simple and thuse maybe of limited use. There are no parameter validations, no default param values, "the target" is always a string.

Also it must be noted that fixed parts have an absolute precedence over parameters. If two routes shares the start and then one follows with a fixed part and the other one with a parameter, then the parameter can never have the value of fixed part even if it leads to no match. It is also the intention.

Having routes like this:

    $router->add_route( 'tree/:species/branches', 'tree.branches' );
    $router->add_route( 'tree/search', 'tree.search' );

the path tree/search/branches doesnot match.

At the other hand the mapping is fast. For the direct mapping path to ($name, $args) it is a simple DFA, the reverse mapping ($name, $args) is a simple hash lookup.

DEPENDENCIES

None so far.

AUTHOR

Roman Daniel <roman.daniel@davosro.cz>

COPYRIGHT AND LICENSE

This software is copyright (c) 2014 by Roman Daniel.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.