Initial Import
[p5sagit/Excel-Template.git] / lib / Excel / Template / Container.pm
CommitLineData
d0eafc11 1package Excel::Template::Container;
2
3use strict;
4
5BEGIN {
6 use vars qw(@ISA);
7 @ISA = qw(Excel::Template::Base);
8
9 use Excel::Template::Base;
10}
11
12# Containers are objects that can contain arbitrary elements, such as
13# PageDefs or Loops.
14
15sub new
16{
17 my $class = shift;
18 my $self = $class->SUPER::new(@_);
19
20 $self->{ELEMENTS} = [] unless UNIVERSAL::isa($self->{ELEMENTS}, 'ARRAY');
21
22 return $self;
23}
24
25sub _do_page
26{
27 my $self = shift;
28 my ($method, $context) = @_;
29
30 for my $e (@{$self->{ELEMENTS}})
31 {
32 $e->enter_scope($context);
33 $e->$method($context);
34 $e->exit_scope($context, 1);
35 }
36
37 return 1;
38}
39
40sub begin_page { _do_page 'begin_page', @_ }
41sub end_page { _do_page 'end_page', @_ }
42
43sub iterate_over_children
44{
45 my $self = shift;
46 my ($context) = @_;
47
48 my $continue = 1;
49
50 for my $e (
51 @{$self->{ELEMENTS}})
52 {
53 $e->enter_scope($context);
54
55 my $rc = $e->render($context);
56 $continue = $rc if $continue;
57
58 $e->exit_scope($context);
59 }
60
61 return $continue;
62}
63
64sub render { $_[0]->iterate_over_children($_[1]) }
65#{
66# my $self = shift;
67# my ($context) = @_;
68#
69# return $self->iterate_over_children($context);
70#}
71
72sub max_of
73{
74 my $self = shift;
75 my ($context, $attr) = @_;
76
77 my $max = $context->get($self, $attr);
78
79 ELEMENT:
80 foreach my $e (@{$self->{ELEMENTS}})
81 {
82 $e->enter_scope($context);
83
84 my $v = $e->isa('CONTAINER')
85 ? $e->max_of($context, $attr)
86 : $e->calculate($context, $attr);
87
88 $max = $v if $max < $v;
89
90 $e->exit_scope($context, 1);
91 }
92
93 return $max;
94}
95
96sub total_of
97{
98 my $self = shift;
99 my ($context, $attr) = @_;
100
101 my $total = 0;
102
103 ELEMENT:
104 foreach my $e (@{$self->{ELEMENTS}})
105 {
106 $e->enter_scope($context);
107
108 $total += $e->isa('CONTAINER')
109 ? $e->total_of($context, $attr)
110 : $e->calculate($context, $attr);
111
112 $e->exit_scope($context, 1);
113 }
114
115 return $total;
116}
117
1181;
119__END__
120
121=head1 NAME
122
123Excel::Template::Container
124
125=head1 PURPOSE
126
127=head1 NODE NAME
128
129=head1 INHERITANCE
130
131=head1 ATTRIBUTES
132
133=head1 CHILDREN
134
135=head1 AFFECTS
136
137=head1 DEPENDENCIES
138
139=head1 USAGE
140
141=head1 AUTHOR
142
143Rob Kinyon (rkinyon@columbus.rr.com)
144
145=head1 SEE ALSO
146
147=cut