pages/ -> matches /pages/
pages/$id -> matches /pages/1 ... (id => 1)
pages/slug/$slug -> matches /pages/slug/some-slug-here (slug => some-slug-here)
For the purposes of this class a URI path is broken into parts delimited
with a '/'. There are two kinds of path parts: static and parametric. Static matches
have precedence over parametric matches. For example, if you have the following routes:
(1) /pages/$page_title/
(2) /pages/a-page/
(3) /pages/$page_title/$id
A request of "/pages/a-page/" will match (2) and the result will not contain an argument.
A request of "/pages/b-page/" will match (1) and the result will contain argument ("page_title" => "b_page")
A request of "/pages/a-page/1" will match (3) with result arguments ("page_title" => "a_page", "id" => "1")
Note: Because routing trees are serialized and unserialized frequently I am breaking the naming
conventions and using short, one-letter member names.