Plack::Builder - OO and DSL to enable Plack Middlewares
# in .psgi use Plack::Builder; my $app = sub { ... }; builder { enable "Plack::Middleware::Foo"; enable "Plack::Middleware::Bar", opt => "val"; enable "Plack::Middleware::Baz"; $app; }; # use URLMap builder { mount "/foo" => builder { enable "Plack::Middleware::Foo"; $app; }; mount "/bar" => $app2; mount "http://example.com/" => builder { $app3 }; };
Plack::Builder gives you a quick domain specific language (DSL) to wrap your application with Plack::Middleware subclasses. The middleware you're trying to use should use Plack::Middleware as a base class to use this DSL, inspired by Rack::Builder.
Whenever you call add on any middleware, the middleware app is pushed to the stack inside the builder, and then reversed when it actually creates a wrapped application handler, so:
add
builder { enable "Plack::Middleware::Foo"; enable "Plack::Middleware::Bar", opt => "val"; $app; };
is syntactically equal to:
$app = Plack::Middleware::Bar->wrap($app, opt => "val"); $app = Plack::Middleware::Foo->wrap($app);
In other words, you're suposed to add middleware from outer to inner.
Plack::Builder has a native support for Plack::App::URLMap with mount method.
mount
use Plack::Builder; my $app = builder { mount "/foo" => $app1; mount "/bar" => builder { enable "Plack::Middleware::Foo"; $app2; }; };
See Plack::App::URLMap's map method to see what they mean. With builder you can't use map as a DSL, for the obvious reason :)
map
Plack::Middleware Plack::App::URLMap
To install Plack, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Plack
CPAN shell
perl -MCPAN -e shell install Plack
For more information on module installation, please visit the detailed CPAN module installation guide.