# NAME
Dancer::Plugin::Chain - Chained actions for Dancer
# VERSION
version 0.1.1
# SYNOPSIS
```perl
use Dancer;
use Dancer::Plugin::Chain;
my $country = chain '/country/:country' => sub {
# silly example. Typically much more work would
# go on in here
var 'site' => param('country');
};
my $event = chain '/event/:event' => sub {
var 'event' => param('event');
};
# will match /country/usa/event/yapc
get chain $country, $event, '/schedule' => sub {
return sprintf "schedule of %s in %s\n", map { var $_ }
qw/ event site /;
};
my $continent = chain '/continent/:continent' => sub {
var 'site' => param('continent');
};
my $continent_event = chain $continent, $event;
# will match /continent/europe/event/yapc
get chain $continent_event, '/schedule' => sub {
return sprintf "schedule of %s in %s\n", map { var $_ } qw/ event site /;
};
# will match /continent/asia/country/japan/event/yapc
# and will do special munging in-between!
get chain $continent,
sub { var temp => var 'site' },
$country,
sub {
var 'site' => join ', ', map { var $_ } qw/ site temp /
},
$event,
'/schedule'
=> sub {
return sprintf "schedule of %s in %s\n", map { var $_ }
qw/ event site /;
};
```
# DESCRIPTION
Implementation of Catalyst-like chained routes. This kind of behavior can
usually be fulfilled by judicious uses of `prefix`. But hey, diversity is
the spice of life, so there you go.
The plugin exports a single keyword, `chain`, which creates the chained
routes.
## KNOWN CAVEATS
The plugin only support string-based urls for now (so no regexes).
# EXPORTED FUNCTIONS
## chain @chain\_items, $coderef
Create a chain out of the items provided, and assign it the final action coderef.
Each chain item can be
a string representing a path segment, a previously defined chain or an
anonymous function. The chain's final path and action will be the aggregate of
its parts.
For example, the final route declaration of the SYNOPSIS,
```perl
get chain $continent,
sub { var temp => var 'site' },
$country,
sub {
var 'site' => join ', ', map { var $_ } qw/ site temp /
},
$event,
'/schedule'
=> sub {
return sprintf "schedule of %s in %s\n", map { var $_ }
qw/ event site /;
};
```
would be is equivalent to
```perl
get '/continent/:continent/country/:country/event/:event/schedule' => sub {
var 'site' => param('continent');
var temp => var 'site';
var 'site' => param('country');
var 'site' => join ', ', map { var $_ } qw/ site temp /
var 'event' => param('event');
return sprintf "schedule of %s in %s\n", map { var $_ }
qw/ event site /;
}
```
In scalar context, `chain` returns its underlying object.
In list context, it returns a route / action pair of values (). That's how it
can work transparently with `get`, `post` and friends.
```perl
# returns the object, that can be used to forge longer chains.
my $foo_chain = chain '/foo', sub { ... };
# returns the pair that makes 'get' happy
get chain $foo_chain;
```
# SEE ALSO
- Original blog entry: [
http://techblog.babyl.ca/entry/dancer-in-chains](
http://techblog.babyl.ca/entry/dancer-in-chains)
- [Dancer-Plugin-Dispatcher](
https://metacpan.org/pod/Dancer-Plugin-Dispatcher)
# AUTHOR
Yanick Champoux <
[email protected]> [](
http://coderwall.com/yanick)
# COPYRIGHT AND LICENSE
This software is copyright (c) 2017, 2014 by Yanick Champoux.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.