There are several separate distributions on CPAN that implement routes dispatching. Below is my attempt in comparing Router::Simple, Path::Router, HTTP::Router, Routes::Tiny and Path::Dispatcher.
+-------------------+-------------+----------+----------+----------+---------~
| Name | Constraints | Optional | Grouping | Globbing | To path ~
+-------------------+-------------+----------+----------+----------+---------~
| Router::Simple | + | - | - | + | - ~
| Path::Router | + | + | - | - | + ~
| HTTP::Router | + | - | - | - | + ~
| Routes::Tiny | + | + | + | + | + ~
| Path::Dispatcher | + | + | + | + | - ~
+-------------------+-------------+----------+----------+----------+---------~
~-------------------+-----------+------+
~ Name | Subroutes | PSGI |
~-------------------+-----------+------+
~ Router::Simple | + | + |
~ Path::Router | + | +* |
~ HTTP::Router | + | - |
~ Routes::Tiny | - | - |
~ Path::Dispatcher | + | + |
~-------------------+-----------+------+
* via Plack::App::Path::Router (thanks to Arun Prasaad)
Explanations
Constraints
Ability to limit a capture to a specific regexp. For example, we want to match /articles/1 but not /article/foo, so we add a constraint like \d+.
Optional
Ability to add optional captures. For example, we want to match /blog/2010/01 and /blog/2010 without specifying an additional route.
Grouping
Ability to capture not just between slashes. For example, we want to match /hello-user, capturing hello and user.
Globbing
Ability to capture path using globbing. For example, we want to match /book/title/that/constains/slashes without worring what goes after title.
To path
Ability to build a path from a route. For example, we don't want to specify paths directly in the templates, so we can use something like
build_path('article', id => 1)
and get /articles/1.
Subroutes
Ability to mount subroutes on a specific route. For example, we want to add routes that all start with /admin/.
PSGI support
Easy integration into PSGI frameworks. Ability to match against PSGI environment.
Disclaimer
If you found any error, please correct me.
