File Coverage

blib/lib/Test/Stream/Stack.pm
Criterion Covered Total %
statement 51 51 100.0
branch 16 18 88.8
condition 7 11 63.6
subroutine 14 14 100.0
pod 7 7 100.0
total 95 101 94.0


line stmt bran cond sub pod time code
1             package Test::Stream::Stack;
2 109     109   1006 use strict;
  109         120  
  109         2521  
3 109     109   333 use warnings;
  109         96  
  109         1991  
4              
5 109     109   39839 use Test::Stream::Hub();
  109         163  
  109         1992  
6              
7 109     109   523 use Carp qw/confess/;
  109         101  
  109         29866  
8              
9             sub new {
10 176     176 1 279 my $class = shift;
11 176         458 return bless [], $class;
12             }
13              
14             sub new_hub {
15 366     366 1 428 my $self = shift;
16 366         695 my %params = @_;
17              
18 366   100     1231 my $class = delete $params{class} || 'Test::Stream::Hub';
19              
20 366         1861 my $hub = $class->new(%params);
21              
22 366 100       781 if (@$self) {
23 240         731 $hub->inherit($self->[-1], %params);
24             }
25             else {
26             $hub->format(Test::Stream::Sync->formatter->new)
27 126 50 33     1105 unless $hub->format || exists($params{formatter});
28              
29 126         618 my $ipc = Test::Stream::Sync->ipc;
30 126 50 66     828 if ($ipc && !$hub->ipc && !exists($params{ipc})) {
      66        
31 112         1220 $hub->set_ipc($ipc);
32 112         702 $ipc->add_hub($hub->hid);
33             }
34             }
35              
36 366         641 push @$self => $hub;
37              
38 366         944 $hub;
39             }
40              
41             sub top {
42 2495     2495 1 2496 my $self = shift;
43 2495 100       4373 return $self->new_hub unless @$self;
44 2369         3923 return $self->[-1];
45             }
46              
47             sub peek {
48 2     2 1 3 my $self = shift;
49 2 100       8 return @$self ? $self->[-1] : undef;
50             }
51              
52             sub cull {
53 1     1 1 4 my $self = shift;
54 1         4 $_->cull for reverse @$self;
55             }
56              
57             sub all {
58 235     235 1 334 my $self = shift;
59 235         645 return @$self;
60             }
61              
62             sub clear {
63 2     2 1 251 my $self = shift;
64 2         7 @$self = ();
65             }
66              
67             # Do these last without keywords in order to prevent them from getting used
68             # when we want the real push/pop.
69              
70             {
71 109     109   481 no warnings 'once';
  109         143  
  109         14820  
72              
73             *push = sub {
74 141     141   405 my $self = shift;
75 141         147 my ($hub) = @_;
76 141 100       640 $hub->inherit($self->[-1]) if @$self;
77 141         278 push @$self => $hub;
78             };
79              
80             *pop = sub {
81 367     367   864 my $self = shift;
82 367         412 my ($hub) = @_;
83 367 100       857 confess "No hubs on the stack"
84             unless @$self;
85 366 100       782 confess "You cannot pop the root hub"
86             if 1 == @$self;
87 365 100       959 confess "Hub stack mismatch, attempted to pop incorrect hub"
88             unless $self->[-1] == $hub;
89 364         650 pop @$self;
90             };
91             }
92              
93             1;
94              
95             __END__