Added filehandles to be parseable
[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
c11fa570 20 $self->{ELEMENTS} = []
21 unless exists $self->{ELEMENTS} &&
22 UNIVERSAL::isa($self->{ELEMENTS}, 'ARRAY');
d0eafc11 23
24 return $self;
25}
26
27sub _do_page
28{
29 my $self = shift;
30 my ($method, $context) = @_;
31
32 for my $e (@{$self->{ELEMENTS}})
33 {
34 $e->enter_scope($context);
35 $e->$method($context);
36 $e->exit_scope($context, 1);
37 }
38
39 return 1;
40}
41
42sub begin_page { _do_page 'begin_page', @_ }
43sub end_page { _do_page 'end_page', @_ }
44
45sub iterate_over_children
46{
47 my $self = shift;
48 my ($context) = @_;
49
50 my $continue = 1;
51
52 for my $e (
53 @{$self->{ELEMENTS}})
54 {
55 $e->enter_scope($context);
56
57 my $rc = $e->render($context);
58 $continue = $rc if $continue;
59
60 $e->exit_scope($context);
61 }
62
63 return $continue;
64}
65
66sub render { $_[0]->iterate_over_children($_[1]) }
67#{
68# my $self = shift;
69# my ($context) = @_;
70#
71# return $self->iterate_over_children($context);
72#}
73
74sub max_of
75{
76 my $self = shift;
77 my ($context, $attr) = @_;
78
79 my $max = $context->get($self, $attr);
80
81 ELEMENT:
82 foreach my $e (@{$self->{ELEMENTS}})
83 {
84 $e->enter_scope($context);
85
86 my $v = $e->isa('CONTAINER')
87 ? $e->max_of($context, $attr)
88 : $e->calculate($context, $attr);
89
90 $max = $v if $max < $v;
91
92 $e->exit_scope($context, 1);
93 }
94
95 return $max;
96}
97
98sub total_of
99{
100 my $self = shift;
101 my ($context, $attr) = @_;
102
103 my $total = 0;
104
105 ELEMENT:
106 foreach my $e (@{$self->{ELEMENTS}})
107 {
108 $e->enter_scope($context);
109
110 $total += $e->isa('CONTAINER')
111 ? $e->total_of($context, $attr)
112 : $e->calculate($context, $attr);
113
114 $e->exit_scope($context, 1);
115 }
116
117 return $total;
118}
119
1201;
121__END__
122
123=head1 NAME
124
125Excel::Template::Container
126
127=head1 PURPOSE
128
129=head1 NODE NAME
130
131=head1 INHERITANCE
132
133=head1 ATTRIBUTES
134
135=head1 CHILDREN
136
137=head1 AFFECTS
138
139=head1 DEPENDENCIES
140
141=head1 USAGE
142
143=head1 AUTHOR
144
c09684ff 145Rob Kinyon (rob.kinyon@gmail.com)
d0eafc11 146
147=head1 SEE ALSO
148
149=cut