File Coverage

blib/lib/PlackX/MiddlewareStack.pm
Criterion Covered Total %
statement 22 52 42.3
branch 1 4 25.0
condition n/a
subroutine 8 13 61.5
pod 0 6 0.0
total 31 75 41.3


line stmt bran cond sub pod time code
1             package PlackX::MiddlewareStack;
2 2     2   481 use strict;
  2         3  
  2         58  
3 2     2   13 use warnings;
  2         2  
  2         56  
4 2     2   48 use 5.008_001;
  2         6  
  2         119  
5             our $VERSION = '0.011';
6              
7 2     2   1787 use Tie::LLHash;
  2         3235  
  2         1135  
8              
9             sub new {
10 1     1 0 12 my $class = shift;
11 1         2 my %middlewares = ();
12 1         7 tie( %middlewares, 'Tie::LLHash' );
13 1         25 bless { middlewares => \%middlewares }, $class;
14             }
15              
16             sub add {
17 1     1 0 7 my ( $self, $mw_class, $args ) = @_;
18              
19 1         6 my $mw = $self->_to_middleware( $mw_class, $args );
20 0         0 ( tied %{ $self->{middlewares} } )->last( $mw_class => $mw );
  0         0  
21             }
22              
23             sub insert_after {
24 0     0 0 0 my ( $self, $mw_class_to_add, $args, $target_mw_class ) = @_;
25              
26 0         0 my $mw = $self->_to_middleware( $mw_class_to_add, $args );
27 0         0 ( tied %{ $self->{middlewares} } )
  0         0  
28             ->insert( $mw_class_to_add => $mw, $target_mw_class );
29             }
30              
31             sub insert_before {
32 0     0 0 0 my ( $self, $mw_class_to_add, $args, $target_mw_class ) = @_;
33              
34 0         0 my $mw = $self->_to_middleware( $mw_class_to_add, $args );
35 0         0 my $before_target
36 0         0 = ( tied %{ $self->{middlewares} } )->key_before($target_mw_class);
37 0         0 ( tied %{ $self->{middlewares} } )
  0         0  
38             ->insert( $mw_class_to_add => $mw, $before_target );
39             }
40              
41             sub to_app {
42 0     0 0 0 my ( $self, $app ) = @_;
43              
44 0         0 for my $mw_class ( reverse keys %{ $self->{middlewares} } ) {
  0         0  
45 0         0 my $mw = $self->{middlewares}->{$mw_class};
46 0         0 $app = $mw->($app);
47             }
48 0         0 $app;
49             }
50              
51             sub _to_middleware {
52 1     1   2 my ( $self, $mw_class, $args ) = @_;
53              
54 1     1   63 eval "use $mw_class";
  1         352  
  0            
  0            
55 1 50       230 die $@ if $@;
56              
57 0         0 my @args = ();
58 0 0       0 while ( my ( $key, $value ) = each( %{ $args || {} } ) ) {
  0         0  
59 0         0 push @args, $key;
60 0         0 push @args, $value;
61             }
62              
63 0     0   0 my $mw = sub { $mw_class->wrap( $_[0], @args ) };
  0         0  
64 0         0 $mw;
65             }
66              
67             sub middleware_classes {
68 0     0 0 0 keys %{ shift->{middlewares} };
  0         0  
69             }
70              
71             1;
72              
73             __END__