-
Notifications
You must be signed in to change notification settings - Fork 214
/
Builder.pm
78 lines (52 loc) · 1.47 KB
/
Builder.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package Plack::Builder;
use strict;
use base qw( Exporter );
our @EXPORT = qw( builder );
sub builder(&) {
my $block = shift;
no warnings 'redefine';
my @wrappers;
local *Plack::Middleware::enable = sub {
my($class, @args) = @_;
push @wrappers, sub { $class->wrap(@args, $_[0]) };
};
my $app = $block->();
for my $mw (reverse @wrappers) {
$app = $mw->($app);
}
return $app;
}
1;
__END__
=head1 NAME
Plack::Builder - DSL to enable Plack::Middleware in .psgi files
=head1 SYNOPSIS
use Plack::Builder
use Plack::Middleware qw( Foo Bar Baz );
my $app = sub { ... };
builder {
enable Plack::Middleware::Foo;
enable Plack::Middleware::Bar opt => "val";
enable Plack::Middleware::Baz;
$app;
};
=head1 DESCRIPTION
Plack::Builder gives you a quick DSL to wrap your application with
Plack::Middleware subclasses. The middleware you're trying to use
should use L<Plack::Middleware> as a base class to use this DSL,
inspired by Rack::Builder.
Whenever you call C<enable> 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:
builder {
enable Plack::Middleware::Foo;
enable Plack::Middleware::Bar opt => "val";
$app;
};
is syntactically equal to:
Plack::Middleware::Foo->wrap(
Plack::Middleware::Bar->wrap(opt => "val", $app)
);
=head1 SEE ALSO
L<Plack::Middleware>
=cut