NAME
Wurm::let - Local Evaluation Tether
SYNOPSIS
use Wurm qw(let);
use Data::Dumper;
# Re-implements the Hello, World app with let.
sub build_grub {
  my ($name) = @_;
  return Wurm::let->new
  ->gate(sub {
    my $meal = shift;
    $meal->{vent}{to} = ucfirst $name;
    push @{$meal->{grit}{path}}, $name. '/gate';
    return;
  })
  ->neck(sub {
    my $meal = shift;
    push @{$meal->{grit}{path}}, $name. '/neck';
    return;
  })
  # The same as ->body(get       => sub { })
  # The same as ->body([qw(get)] => sub { })
  ->get(sub {
    my $meal = shift;
    push @{$meal->{grit}{path}}, $name. '/body:get';
    return;
  })
  ->tail(sub {
    my $meal = shift;
    push @{$meal->{grit}{path}}, $name. '/tail';
    return wrap_it_up($meal);
  })
};
sub wrap_it_up {
  my $meal = shift;
  my $path = join ', ', @{$meal->{grit}{path}};
  my $text = '';
  $text .= "$meal->{mind}{intro} $meal->{vent}{to},\n";
  $text .= "This is the path I took: $path\n";
  $text .= "This is what is in the tube: $meal->{tube}\n";
  $text .= "This is what I've seen: $meal->{seen}\n";
  return Wurm::_200('text/plain', $text);
}
# How many methods are called before the assignment is made?
# This is the 'root' grub.
my $grub = build_grub('root')
  ->case(sub {
    my $meal = shift;
    $meal->{vent}{to}   = 'Nobody';
    $meal->{grit}{path} = [ ];
    return $meal;
  })
  ->pore(sub {
    my ($res, $meal) = @_;
    $res->[2][0] = $res->[2][0]
      . ($res->[0] == 200 ? '' : "\n")
      . 'PSGI env: '. Dumper($meal->{env})
    ;
    return $res;
  })
;
{
  # C<grub()> will make a new grub for us.
  # Or use what we give it.
  my $what = $grub->grub(wurm => build_grub('wurm'));
  # Grubs molt to become pretty butterflies.
  # If you believe nested hashes of anonymous sub-routines are
  # beautiful.  Or butterflies.
  # Tubes require molted grubs.
  $what->tube($_ => build_grub($_)->molt)
    for qw(foo bar baz);
  # I don't... better not to ask questions.  This looks nasty.
  $grub->grub($_ => $what->molt->{tube}{$_})
    for qw(foo baz);
  # qux is already molted inside $what.  eww.
  # I told you it was special.
  my $qux = $what->grub(qux => build_grub('qux'));
  $qux->gate(sub {
    my ($meal) = @_;
    $meal->{vent}{to} = 'Lord Qux';
    push @{$meal->{grit}{path}}, '*/gate';
    return wrap_it_up($meal);
  });
}
# Now turn the... uh... thing into an application.
my $app = Wurm::wrapp($grub->molt, {intro => 'Hello'});
$app
DESCRIPTION
Wurm::let is a utility module for helping create Wurm applications. It provides an easy-to-use OO interface for constructing folding rules without requiring applications to be OO-enabled themselves.
You can enable 'let' in two way:
use Wurm::let;
- or -
use Wurm qw(let);
METHODS
All methods (with the exception of grub) are meant for call chaining by returning the Wurm::let object. The grub method returns a new Wurm::let which can then be call-chained for setup.
- new($bulk)
 - 
Creates a
Wurm::letobject for manipulating$bulk. If$bulkis not provided, it will be created as aHASHreference. - molt()
 - 
Returns the
$bulk. Since folding rules are references,molt()can be called any time while still allowing changes to theWurm::let. This allows you to either forward construct down-stream application logic and attach it in-whole to up-stream parts. Or you can create up-sream logic and generate down-stream pieces from it. - case($code)
 - 
Installs a
casehandler. - pore($code)
 - 
Installs a
porehandler. - gate($code)
 - 
Installs a
gatehandler. - neck($code)
 - 
Installs a
neckhandler. - tail($code)
 - 
Installs a
tailhandler. - tube($name, $wurm)
 - 
Installs a
tubehandler tree with the key$nameand a folding ruleset of$wurm. If$wurmis not provided it will be created for you. An easy way to chain application parts together is to createWurm::letobjects andmolt()them intotubeor usegrubbelow.my $stub = Wurm::let->new ->gate(sub { }) ->post(sub { }) ; my $root = Wurm::let->new ->case(sub { }) ->pore(sub { }) ->tube(foo => $stub->molt) ->tube(bar => $stub->molt) ; - grub($name, $grub)
 - 
Installs a
tubehandler tree with the key$nameand a folding ruleset of$grub. If$grubis not provided it will be created for you. If it is aHASHreference, it will be converted to aWurm::letobject which is returned.my $root = Wurm::let->new; # /mirror/ now contains the same folding rules as $root $root->grub(mirror => $root) ->tail(sub { }); # changes /mirror/ # /foo/ will respond to gate and body/{get,post} my $wurm = {gate => sub { ... }, ...}; my $grub = $root->grub(foo => $wurm); $grub->body([qw(get post)] => sub { ... }); - body($methods, $code)
 - 
Installs a
bodyhandler.$methodscan either be a simple string or anARRAYreference. If multiple methods are given, the same handler is installed for all of them. - get($code)
 - 
Installs a body handler for the 'GET' HTTP method.
 - head($code)
 - 
Installs a body handler for the 'HEAD' HTTP method.
 - post($code)
 - 
Installs a body handler for the 'POST' HTTP method.
 - put($code)
 - 
Installs a body handler for the 'PUT' HTTP method.
 - delete($code)
 - 
Installs a body handler for the 'DELETE' HTTP method.
 - trace($code)
 - 
Installs a body handler for the 'TRACE' HTTP method.
 - options($code)
 - 
Installs a body handler for the 'OPTIONS' HTTP method.
 - connect($code)
 - 
Installs a body handler for the 'CONNECT' HTTP method.
 - patch($code)
 - 
Installs a body handler for the 'PATCH' HTTP method.
 
SEE ALSO
AUTHOR
jason hord <pravus@cpan.org>
LICENSE
This software is information. It is subject only to local laws of physics.