1use strict; 2use warnings; 3 4package Test::Deep::Stack; 5 6use Carp qw( confess ); 7 8use Test::Deep::MM qw( new init Stack Arrow ); 9 10sub init 11{ 12 my $self = shift; 13 14 $self->SUPER::init(@_); 15 16 $self->setStack([]) unless $self->getStack; 17} 18 19sub push 20{ 21 my $self = shift; 22 23 push(@{$self->getStack}, @_); 24} 25 26sub pop 27{ 28 my $self = shift; 29 30 return pop @{$self->getStack}; 31} 32 33sub render 34{ 35 my $self = shift; 36 my $var = shift; 37 38 my $stack = $self->getStack; 39 40 $self->setArrow(0); 41 42 foreach my $data (@$stack) 43 { 44 my $exp = $data->{exp}; 45 if (UNIVERSAL::isa($exp, "Test::Deep::Cmp")) 46 { 47 $var = $exp->render_stack($var, $data); 48 49 $self->setArrow(0) if $exp->reset_arrow; 50 } 51 else 52 { 53 confess "Don't know how to render '$exp'"; 54 } 55 } 56 57 return $var; 58} 59 60sub getLast 61{ 62 my $self = shift; 63 64 return $self->getStack->[-1]; 65} 66 67sub incArrow 68{ 69 my $self = shift; 70 71 my $a = $self->getArrow; 72 $self->setArrow($a + 1); 73 74 return $a; 75} 76 77sub length 78{ 79 my $self = shift; 80 81 return @{$self->getStack} + 0; 82} 83 841; 85