File Coverage

blib/lib/Catalyst/Middleware/Stash.pm
Criterion Covered Total %
statement 29 31 93.5
branch 7 8 87.5
condition 2 5 40.0
subroutine 9 10 90.0
pod 3 3 100.0
total 50 57 87.7


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