line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
163
|
|
|
163
|
|
1762
|
use strict; |
|
163
|
|
|
|
|
437
|
|
|
163
|
|
|
|
|
4331
|
|
2
|
163
|
|
|
163
|
|
1051
|
use warnings; |
|
163
|
|
|
|
|
529
|
|
|
163
|
|
|
|
|
5885
|
|
3
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
use base 'Plack::Middleware'; |
6
|
163
|
|
|
163
|
|
944
|
use Exporter 'import'; |
|
163
|
|
|
|
|
701
|
|
|
163
|
|
|
|
|
24723
|
|
7
|
163
|
|
|
163
|
|
1141
|
use Carp 'croak'; |
|
163
|
|
|
|
|
429
|
|
|
163
|
|
|
|
|
4370
|
|
8
|
163
|
|
|
163
|
|
942
|
|
|
163
|
|
|
|
|
490
|
|
|
163
|
|
|
|
|
51704
|
|
9
|
|
|
|
|
|
|
our @EXPORT_OK = qw(stash get_stash); |
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
my $env = shift; |
13
|
|
|
|
|
|
|
return $env->{+PSGI_KEY} || |
14
|
|
|
|
|
|
|
croak "You requested a stash, but one does not exist."; |
15
|
2414
|
|
|
2414
|
1
|
3673
|
} |
16
|
2414
|
|
33
|
|
|
7033
|
|
17
|
|
|
|
|
|
|
my ($host, @args) = @_; |
18
|
|
|
|
|
|
|
return get_stash($host->env) |
19
|
|
|
|
|
|
|
->(@args); |
20
|
|
|
|
|
|
|
} |
21
|
0
|
|
|
0
|
1
|
0
|
|
22
|
0
|
|
|
|
|
0
|
my $self = shift; |
23
|
|
|
|
|
|
|
my $stash = shift || +{}; |
24
|
|
|
|
|
|
|
return sub { |
25
|
|
|
|
|
|
|
if(@_) { |
26
|
|
|
|
|
|
|
my $new_stash = @_ > 1 ? {@_} : $_[0]; |
27
|
920
|
|
|
920
|
|
1617
|
croak('stash takes a hash or hashref') |
28
|
920
|
|
50
|
|
|
3395
|
unless ref $new_stash; |
29
|
|
|
|
|
|
|
foreach my $key (keys %$new_stash) { |
30
|
2414
|
100
|
|
2414
|
|
5445
|
$stash->{$key} = $new_stash->{$key}; |
31
|
627
|
100
|
|
|
|
2597
|
} |
32
|
627
|
50
|
|
|
|
1690
|
} |
33
|
|
|
|
|
|
|
$stash; |
34
|
627
|
|
|
|
|
1828
|
}; |
35
|
629
|
|
|
|
|
1928
|
} |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
my ($self, $env) = @_; |
38
|
2414
|
|
|
|
|
6332
|
$env->{+PSGI_KEY} = $self->_create_stash |
39
|
920
|
|
|
|
|
3901
|
unless exists($env->{+PSGI_KEY}); |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
return $self->app->($env); |
42
|
|
|
|
|
|
|
} |
43
|
923
|
|
|
923
|
1
|
178921
|
|
44
|
|
|
|
|
|
|
=head1 NAME |
45
|
923
|
100
|
|
|
|
3723
|
|
46
|
|
|
|
|
|
|
Catalyst::Middleware::Stash - The Catalyst stash - in middleware |
47
|
923
|
|
|
|
|
2657
|
|
48
|
|
|
|
|
|
|
=head1 DESCRIPTION |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
We've moved the L<Catalyst> stash to middleware. Please don't use this |
51
|
|
|
|
|
|
|
directly since it is likely to move off the Catalyst namespace into a stand |
52
|
|
|
|
|
|
|
alone distribution |
53
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
We store a coderef under the C<PSGI_KEY> which can be dereferenced with |
55
|
|
|
|
|
|
|
key values or nothing to access the underlying hashref. |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
Anything placed into the stash will be available in the stash of any 'mounted' |
58
|
|
|
|
|
|
|
Catalyst applications. A mounted Catalyst application may set the stash and |
59
|
|
|
|
|
|
|
'pass back' information to the parent application. Non Catalyst applications |
60
|
|
|
|
|
|
|
may use this middleware to access and set stash values. |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
Please note I highly recommend having a stronger interface than a stash key |
63
|
|
|
|
|
|
|
between applications. |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
For more information the current test case t/middleware-stash.t is the best |
66
|
|
|
|
|
|
|
documentation. |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
=head1 SUBROUTINES |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
This class defines the following subroutines. |
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
=head2 PSGI_KEY |
73
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
Returns the hash key where we store the stash. You should not assume |
75
|
|
|
|
|
|
|
the string value here will never change! Also, its better to use |
76
|
|
|
|
|
|
|
L</get_stash> or L</stash>. |
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
=head2 get_stash |
79
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
Expect: $psgi_env. |
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
Exportable subroutine. |
83
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
Get the stash out of the C<$env>. |
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
=head2 stash |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
Expects: An object that does C<env> and arguments |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
Exportable subroutine. |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
Given an object with a method C<env> get or set stash values, either |
93
|
|
|
|
|
|
|
as a method or via hashref modification. This stash is automatically |
94
|
|
|
|
|
|
|
reset for each request (it is not persistent or shared across connected |
95
|
|
|
|
|
|
|
clients. Stash key / value are stored in memory. |
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
use Plack::Request; |
98
|
|
|
|
|
|
|
use Catalyst::Middleware::Stash 'stash'; |
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
my $app = sub { |
101
|
|
|
|
|
|
|
my $env = shift; |
102
|
|
|
|
|
|
|
my $req = Plack::Request->new($env); |
103
|
|
|
|
|
|
|
my $stashed = $req->stash->{in_the_stash}; # Assume the stash was previously populated. |
104
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
return [200, ['Content-Type' => 'text/plain'], |
106
|
|
|
|
|
|
|
["I found $stashed in the stash!"]]; |
107
|
|
|
|
|
|
|
}; |
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
If the stash does not yet exist, an exception is thrown. |
110
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
=head1 METHODS |
112
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
This class defines the following methods. |
114
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
=head2 call |
116
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
Used by plack to call the middleware |
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
=cut |
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
1; |