File Coverage

blib/lib/WDDX/Array.pm
Criterion Covered Total %
statement 6 121 4.9
branch 0 40 0.0
condition 0 9 0.0
subroutine 2 26 7.6
pod n/a
total 8 196 4.0


line stmt bran cond sub pod time code
1             #!/usr/bin/perl -w
2             #
3             # $Id: Array.pm,v 1.2 2003/10/28 17:00:51 andy Exp $
4             #
5             # This code is copyright 1999-2000 by Scott Guelich
6             # and is distributed according to the same conditions as Perl itself
7             # Please visit http://www.scripted.com/wddx/ for more information
8             #
9              
10             package WDDX::Array;
11              
12             # Auto-inserted by build scripts
13             $VERSION = "1.01";
14              
15 1     1   760 use strict;
  1         2  
  1         30  
16 1     1   5 use Carp;
  1         2  
  1         1657  
17              
18             require WDDX;
19              
20             { my $i_hate_the_w_flag_sometimes = [
21             $WDDX::PACKET_HEADER,
22             $WDDX::PACKET_FOOTER,
23             $WDDX::Array::VERSION
24             ] }
25              
26             1;
27              
28              
29             #/-----------------------------------------------------------------------
30             # Public Methods
31             #
32              
33             sub new {
34 0     0     my( $class, $arrayref ) = @_;
35            
36 0 0         croak "You must supply an array ref when creating a new $class object\n"
37             unless $arrayref;
38            
39 0           my $self = {
40             value => $arrayref,
41             };
42            
43 0           bless $self, $class;
44 0           return $self;
45             }
46              
47              
48             sub type {
49 0     0     return "array";
50             }
51              
52              
53             sub as_packet {
54 0     0     my( $self ) = @_;
55 0           my $output = $WDDX::PACKET_HEADER .
56             $self->_serialize .
57             $WDDX::PACKET_FOOTER;
58             }
59              
60              
61             sub as_arrayref {
62 0     0     my( $self ) = @_;
63 0           return $self->_deserialize;
64             }
65              
66              
67             sub as_javascript {
68 0     0     my( $self, $js_var ) = @_;
69 0           my $arrayref = $self->{value};
70 0           my $output = "$js_var=new Array();";
71            
72 0           for ( my $i = 0; $i < @$arrayref; $i++ ) {
73 0           $output .= $arrayref->[$i]->as_javascript( $js_var . "[$i]" );
74             }
75 0           return $output;
76             }
77              
78              
79             #/-----------------------------------------------------------------------
80             # Other Public Methods
81             #
82              
83              
84             sub get_element {
85 0     0     my( $self, $index ) = @_;
86 0           return $self->{value}[$index];
87             }
88              
89              
90             # Method alias
91             *get = *get = \&get_element;
92              
93              
94             sub set {
95 0     0     my( $self, %pairs ) = @_;
96 0           my( $index, $value );
97            
98 0           while ( ( $index, $value ) = each %pairs ) {
99             croak "The values assigned must be WDDX data objects.\n"
100 0 0         unless eval { $value->can( "_serialize" ) };
  0            
101 0           $self->{value}[$index] = $value;
102             }
103             }
104              
105              
106             sub splice {
107 0     0     my( $self, $offset, $length, @values ) = @_;
108 0           my @result;
109            
110 0 0         if ( @values ) {
    0          
111 0           foreach ( @values ) {
112             croak "The values assigned must be WDDX data objects.\n"
113 0 0         unless eval { $_->can( "_serialize" ) };
  0            
114             }
115 0           @result = splice @{ $self->{value} }, $offset, $length, @values;
  0            
116             }
117             elsif ( defined $length ) {
118 0           @result = splice @{ $self->{value} }, $offset, $length;
  0            
119             }
120             else {
121 0           @result = splice @{ $self->{value} }, $offset;
  0            
122             }
123            
124 0 0         if ( wantarray ) {
125 0           return @result;
126             }
127             else {
128 0 0         return @result ? pop @result : undef;
129             }
130             }
131              
132              
133             sub length {
134 0     0     my( $self ) = @_;
135 0           return scalar @{ $self->{value} };
  0            
136             }
137              
138              
139             sub push {
140 0     0     my( $self, @values ) = @_;
141 0           foreach ( @values ) {
142             croak "The values assigned must be WDDX data objects.\n"
143 0 0         unless eval { $_->can( "_serialize" ) };
  0            
144             }
145 0           push @{ $self->{value} }, @values;
  0            
146             }
147              
148              
149             sub pop {
150 0     0     my( $self ) = @_;
151 0           pop @{ $self->{value} };
  0            
152             }
153              
154              
155             sub shift {
156 0     0     my( $self ) = @_;
157 0           shift @{ $self->{value} };
  0            
158             }
159              
160              
161             sub unshift {
162 0     0     my( $self , @values ) = @_;
163 0           foreach ( @values ) {
164             croak "The values assigned must be WDDX data objects.\n"
165 0 0         unless eval { $_->can( "_serialize" ) };
  0            
166             }
167 0           unshift @{ $self->{value} }, @values;
  0            
168             }
169              
170              
171             #/-----------------------------------------------------------------------
172             # Private Methods
173             #
174              
175             sub is_parser {
176 0     0     return 0;
177             }
178              
179              
180             sub _serialize {
181 0     0     my( $self ) = @_;
182 0           my $value = $self->{value};
183            
184 0           my $length = @$value;
185 0           my $output = "";
186            
187 0           foreach ( @$value ) {
188 0           $output .= $_->_serialize();
189             }
190 0           $output .= "";
191 0           return $output;
192             }
193              
194              
195             sub _deserialize {
196 0     0     my( $self ) = @_;
197 0           my @val_array = map $_->_deserialize, @{ $self->{value} };
  0            
198            
199 0           return \@val_array;
200             }
201              
202             #/-----------------------------------------------------------------------
203             # Parsing Code
204             #
205              
206             package WDDX::Array::Parser;
207              
208              
209             sub new {
210 0     0     my $class = shift;
211            
212 0           my $self = {
213             value => [],
214             'length' => 0,
215             parse_var => undef,
216             seen_arrays => 0,
217             };
218 0           return bless $self, $class;
219             }
220              
221              
222             sub start_tag {
223 0     0     my( $self, $element, $attribs ) = @_;
224 0           my $parse_var = $self->parse_var;
225            
226 0 0 0       if ( $element eq "array" and not $self->{seen_arrays}++ ) {
227 0 0         unless ( $attribs->{'length'} + 0 ) {
228 0           die "Invalid value for length attribute in tag";
229             }
230 0           $self->{'length'} = $attribs->{'length'};
231             }
232             else {
233 0 0         unless ( $parse_var ) {
234 0 0         $parse_var = WDDX::Parser->create_var( $element ) or
235             die "Expecting some data element (e.g., ), " .
236             "found: <$element>\n";
237 0           $self->push( $parse_var );
238             }
239 0           $parse_var->start_tag( $element, $attribs );
240             }
241            
242 0           return $self;
243             }
244              
245              
246             sub end_tag {
247 0     0     my( $self, $element ) = @_;
248 0           my $parse_var = $self->parse_var;
249            
250 0 0 0       if ( $element eq "array" and not --$self->{seen_arrays} ) {
251             # If fewer elements than declared, pad with null objects??
252 0           while ( $self->num_elements < $self->{'length'} ) {
253 0           $self->push( new WDDX::Null() );
254             }
255 0           $self = new WDDX::Array( $self->{value} );
256             }
257             else {
258 0 0         unless ( $parse_var ) {
259             # XML::Parser should actually catch this
260 0           die "Found before <$element>\n";
261             }
262 0           $self->parse_var( $parse_var->end_tag( $element ) );
263             }
264            
265 0           return $self;
266             }
267              
268              
269             sub append_data {
270 0     0     my( $self, $data ) = @_;
271 0           my $parse_var = $self->parse_var;
272            
273 0 0         if ( $parse_var ) {
    0          
274 0           $parse_var->append_data( $data );
275             }
276             elsif ( $data =~ /\S/ ) {
277 0           die "No loose character data is allowed within elements\n";
278             }
279             }
280              
281              
282             sub is_parser {
283 0     0     return 1;
284             }
285              
286              
287             sub parse_var {
288 0     0     my( $self, $var ) = @_;
289 0           my $last_idx = $self->num_elements - 1;
290            
291 0 0         $self->{value}[ $last_idx ] = $var if defined $var;
292 0           my $curr_var = $self->{value}[ $last_idx ];
293 0 0 0       return ( ref $curr_var && $curr_var->is_parser ) ? $curr_var : "";
294             }
295              
296              
297             sub push {
298 0     0     my( $self, $element ) = @_;
299            
300 0 0         die "Number of elements exceeds declared length of \n" if
301             $self->num_elements >= $self->{'length'};
302 0           push @{ $self->{value} }, $element;
  0            
303             }
304              
305              
306             sub num_elements () {
307 0     0     my( $self ) = @_;
308 0           return scalar @{ $self->{value} };
  0            
309             }