'higher' level route and template handler for perl6
Other HTML
Switch branches/tags
Nothing to show
Latest commit 9801edb May 22, 2017 @tony-o committed on GitHub Merge pull request #7 from JJ/master
Fixes markdown
Failed to load latest commit information.
bin fix bin Jan 7, 2017
lib updates for `require` scoping changes Mar 24, 2017
usage fixes for new way handling :: Jan 7, 2017
.travis.yml forgot one depends in travis Oct 15, 2015
META6.json bump version with meta filename modernization May 2, 2017
README.md Fixes markdown May 21, 2017



Build Status


use Hiker;

my $app = Hiker.new(
  hikes     => ['controllers', 'models'],
  templates => 'templates',


Pretty easy, right?

explain yourself

  hikes => ['controllers', 'models'],

hikes are the directories where Hiker should look for any pm6|pl6 files and check for anything resembling a Hiker::Route|Hiker::Model. Since we all love organization, this parameter accepts an array so you can split your models and controllers.

The Hiker::Routes found in these directories are sorted by the type of path (Regex vs Str) and Strs without optional parameters (see HTTP::Server::Router) are given highest priority, then optional param strings, and then regexes.

  templates => 'templates',

Hiker::Route a controller

This role lets Hiker know what this class does. Boilerplate class (controller) would look like the following:

use Hiker::Route;

class MyApp::Basic does Hiker::Route {
  has $.path     = '/'; # can also be a regex, eg: /.+/
  has $.template = 'basic.mustache';
  has $.model    = 'MyApp::Model'; #this is an optional attribute

  method handler($req, $res) {

Note, returning the True value auto renders whatever the $.template is.

Hiker::Model a model

This role lets Hiker know what this class does. Boilerplate class (model) would look like the following:

use Hiker::Model;

class MyApp::Model does Hiker::Model {
  method bind($req, $res) {
    $res.data<data> = qw<do some db or whatever stuff here>;


# hiker init

This will create a boilerplate application for you in the current directory

Request Flow

  • Request is received
  • Hiker runs through all of the routes it found on startup
  • The routes are run through until a True (or a Promise whose result is True) value is returned
  • The template specified by the controller is rendered and the result is sent to the client


Hiker uses Template::Mustache. If the .template specified by the route doesn't exist then a default 404 message is shown to the user.

For the time being this isn't configurable

Stuff to do

  • Allow for custom templating engines
  • Add a weight attribute to the routes so Regex order can be handled better
  • Whatever else the people crave