8 # Pod documentation after __END__ below.
12 sub UNSHIFT { shift->SPLICE(0,0,@_) }
13 sub SHIFT { shift->SPLICE(0,1) }
14 sub CLEAR { shift->STORESIZE(0) }
19 my $i = $obj->FETCHSIZE;
20 $obj->STORE($i++, shift) while (@_);
26 my $newsize = $obj->FETCHSIZE - 1;
30 $val = $obj->FETCH($newsize);
31 $obj->STORESIZE($newsize);
39 my $sz = $obj->FETCHSIZE;
40 my $off = (@_) ? shift : 0;
41 $off += $sz if ($off < 0);
42 my $len = (@_) ? shift : $sz - $off;
44 for (my $i = 0; $i < $len; $i++)
46 push(@result,$obj->FETCH($off+$i));
50 # Move items up to make room
54 for (my $i=$sz-1; $i >= $e; $i--)
56 my $val = $obj->FETCH($i);
57 $obj->STORE($i+$d,$val);
62 # Move items down to close the gap
65 for (my $i=$off+$len; $i < $sz; $i++)
67 my $val = $obj->FETCH($i);
68 $obj->STORE($i-$d,$val);
70 $obj->STORESIZE($sz-$d);
72 for (my $i=0; $i < @_; $i++)
74 $obj->STORE($off+$i,$_[$i]);
81 croak "$pkg dosn't define an EXISTS method";
86 croak "$pkg dosn't define a DELETE method";
89 package Tie::StdArray;
93 sub TIEARRAY { bless [], $_[0] }
94 sub FETCHSIZE { scalar @{$_[0]} }
95 sub STORESIZE { $#{$_[0]} = $_[1]-1 }
96 sub STORE { $_[0]->[$_[1]] = $_[2] }
97 sub FETCH { $_[0]->[$_[1]] }
98 sub CLEAR { @{$_[0]} = () }
99 sub POP { pop(@{$_[0]}) }
100 sub PUSH { my $o = shift; push(@$o,@_) }
101 sub SHIFT { shift(@{$_[0]}) }
102 sub UNSHIFT { my $o = shift; unshift(@$o,@_) }
103 sub EXISTS { exists $_[0]->[$_[1]] }
104 sub DELETE { delete $_[0]->[$_[1]] }
109 my $sz = $ob->FETCHSIZE;
110 my $off = @_ ? shift : 0;
111 $off += $sz if $off < 0;
112 my $len = @_ ? shift : $sz-$off;
113 return splice(@$ob,$off,$len,@_);
122 Tie::Array - base class for tied arrays
128 @ISA = ('Tie::Array');
133 sub FETCHSIZE { ... }
135 sub STORE { ... } # mandatory if elements writeable
136 sub STORESIZE { ... } # mandatory if elements can be added/deleted
137 sub EXISTS { ... } # mandatory if exists() expected to work
138 sub DELETE { ... } # mandatory if delete() expected to work
140 # optional methods - for efficiency
153 @ISA = ('Tie::StdArray');
155 # all methods provided by default
159 $object = tie @somearray,Tie::NewArray;
160 $object = tie @somearray,Tie::StdArray;
161 $object = tie @somearray,Tie::NewStdArray;
167 This module provides methods for array-tying classes. See
168 L<perltie> for a list of the functions required in order to tie an array
169 to a package. The basic B<Tie::Array> package provides stub C<DESTROY>,
170 and C<EXTEND> methods that do nothing, stub C<DELETE> and C<EXISTS>
171 methods that croak() if the delete() or exists() builtins are ever called
172 on the tied array, and implementations of C<PUSH>, C<POP>, C<SHIFT>,
173 C<UNSHIFT>, C<SPLICE> and C<CLEAR> in terms of basic C<FETCH>, C<STORE>,
174 C<FETCHSIZE>, C<STORESIZE>.
176 The B<Tie::StdArray> package provides efficient methods required for tied arrays
177 which are implemented as blessed references to an "inner" perl array.
178 It inherits from B<Tie::Array>, and should cause tied arrays to behave exactly
179 like standard arrays, allowing for selective overloading of methods.
181 For developers wishing to write their own tied arrays, the required methods
182 are briefly defined below. See the L<perltie> section for more detailed
183 descriptive, as well as example code:
187 =item TIEARRAY classname, LIST
189 The class method is invoked by the command C<tie @array, classname>. Associates
190 an array instance with the specified class. C<LIST> would represent
191 additional arguments (along the lines of L<AnyDBM_File> and compatriots) needed
192 to complete the association. The method should return an object of a class which
193 provides the methods below.
195 =item STORE this, index, value
197 Store datum I<value> into I<index> for the tied array associated with
198 object I<this>. If this makes the array larger then
199 class's mapping of C<undef> should be returned for new positions.
201 =item FETCH this, index
203 Retrieve the datum in I<index> for the tied array associated with
208 Returns the total number of items in the tied array associated with
209 object I<this>. (Equivalent to C<scalar(@array)>).
211 =item STORESIZE this, count
213 Sets the total number of items in the tied array associated with
214 object I<this> to be I<count>. If this makes the array larger then
215 class's mapping of C<undef> should be returned for new positions.
216 If the array becomes smaller then entries beyond count should be
219 =item EXTEND this, count
221 Informative call that array is likely to grow to have I<count> entries.
222 Can be used to optimize allocation. This method need do nothing.
224 =item EXISTS this, key
226 Verify that the element at index I<key> exists in the tied array I<this>.
228 The B<Tie::Array> implementation is a stub that simply croaks.
230 =item DELETE this, key
232 Delete the element at index I<key> from the tied array I<this>.
234 The B<Tie::Array> implementation is a stub that simply croaks.
238 Clear (remove, delete, ...) all values from the tied array associated with
243 Normal object destructor method.
245 =item PUSH this, LIST
247 Append elements of LIST to the array.
251 Remove last element of the array and return it.
255 Remove the first element of the array (shifting other elements down)
258 =item UNSHIFT this, LIST
260 Insert LIST elements at the beginning of the array, moving existing elements
263 =item SPLICE this, offset, length, LIST
265 Perform the equivalent of C<splice> on the array.
267 I<offset> is optional and defaults to zero, negative values count back
268 from the end of the array.
270 I<length> is optional and defaults to rest of the array.
272 I<LIST> may be empty.
274 Returns a list of the original I<length> elements at I<offset>.
280 There is no support at present for tied @ISA. There is a potential conflict
281 between magic entries needed to notice setting of @ISA, and those needed to
284 Very little consideration has been given to the behaviour of tied arrays
285 when C<$[> is not default value of zero.
289 Nick Ing-Simmons E<lt>nik@tiuk.ti.comE<gt>