disassemble DispatchNode since Dispatch.pm can now differentiate between dispatch...
[catagits/Web-Simple.git] / lib / Web / Dispatch / Node.pm
1 package Web::Dispatch::Node;
2
3 use Moo;
4
5 with 'Web::Dispatch::ToApp';
6
7 for (qw(match run)) {
8   has "_${_}" => (is => 'ro', required => 1, init_arg => $_);
9 }
10
11 sub call {
12   my ($self, $env) = @_;
13   if (my ($env_delta, @match) = $self->_match->($env)) {
14     ($env_delta, $self->_curry(@match));
15   } else {
16     ()
17   }
18 }
19
20 sub _curry {
21   my ($self, @args) = @_;
22   my $run = $self->_run;
23   my $code = sub { $run->(@args, $_[0]) };
24   # if the first argument is a hashref, localize %_ to it to permit
25   # use of $_{name} inside the dispatch sub
26   ref($args[0]) eq 'HASH'
27     ? do { my $v = $args[0]; sub { local *_ = $v; &$code } }
28     : $code
29 }
30
31 1;