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