+
+=item EXTEND this, count
+X<EXTEND>
+
+Informative call that array is likely to grow to have I<count> entries.
+Can be used to optimize allocation. This method need do nothing.
+
+In our example, we want to make sure there are no blank (C<undef>)
+entries, so C<EXTEND> will make use of C<STORESIZE> to fill elements
+as needed:
+
+ sub EXTEND {
+ my $self = shift;
+ my $count = shift;
+ $self->STORESIZE( $count );
+ }
+
+=item EXISTS this, key
+X<EXISTS>
+
+Verify that the element at index I<key> exists in the tied array I<this>.
+
+In our example, we will determine that if an element consists of
+C<$self-E<gt>{ELEMSIZE}> spaces only, it does not exist:
+
+ sub EXISTS {
+ my $self = shift;
+ my $index = shift;
+ return 0 if ! defined $self->{ARRAY}->[$index] ||
+ $self->{ARRAY}->[$index] eq ' ' x $self->{ELEMSIZE};
+ return 1;
+ }
+
+=item DELETE this, key
+X<DELETE>
+
+Delete the element at index I<key> from the tied array I<this>.
+
+In our example, a deleted item is C<$self-E<gt>{ELEMSIZE}> spaces:
+
+ sub DELETE {
+ my $self = shift;
+ my $index = shift;
+ return $self->STORE( $index, '' );
+ }
+
+=item CLEAR this
+X<CLEAR>
+
+Clear (remove, delete, ...) all values from the tied array associated with
+object I<this>. For example:
+
+ sub CLEAR {
+ my $self = shift;
+ return $self->{ARRAY} = [];
+ }
+
+=item PUSH this, LIST
+X<PUSH>
+
+Append elements of I<LIST> to the array. For example:
+
+ sub PUSH {
+ my $self = shift;
+ my @list = @_;
+ my $last = $self->FETCHSIZE();
+ $self->STORE( $last + $_, $list[$_] ) foreach 0 .. $#list;
+ return $self->FETCHSIZE();
+ }
+
+=item POP this
+X<POP>
+
+Remove last element of the array and return it. For example:
+
+ sub POP {
+ my $self = shift;
+ return pop @{$self->{ARRAY}};
+ }
+
+=item SHIFT this
+X<SHIFT>
+
+Remove the first element of the array (shifting other elements down)
+and return it. For example:
+
+ sub SHIFT {
+ my $self = shift;
+ return shift @{$self->{ARRAY}};
+ }
+
+=item UNSHIFT this, LIST
+X<UNSHIFT>
+
+Insert LIST elements at the beginning of the array, moving existing elements
+up to make room. For example:
+
+ sub UNSHIFT {
+ my $self = shift;
+ my @list = @_;
+ my $size = scalar( @list );
+ # make room for our list
+ @{$self->{ARRAY}}[ $size .. $#{$self->{ARRAY}} + $size ]
+ = @{$self->{ARRAY}};
+ $self->STORE( $_, $list[$_] ) foreach 0 .. $#list;
+ }
+
+=item SPLICE this, offset, length, LIST
+X<SPLICE>
+
+Perform the equivalent of C<splice> on the array.
+
+I<offset> is optional and defaults to zero, negative values count back
+from the end of the array.
+
+I<length> is optional and defaults to rest of the array.
+
+I<LIST> may be empty.
+
+Returns a list of the original I<length> elements at I<offset>.
+
+In our example, we'll use a little shortcut if there is a I<LIST>:
+
+ sub SPLICE {
+ my $self = shift;
+ my $offset = shift || 0;
+ my $length = shift || $self->FETCHSIZE() - $offset;
+ my @list = ();
+ if ( @_ ) {
+ tie @list, __PACKAGE__, $self->{ELEMSIZE};
+ @list = @_;
+ }
+ return splice @{$self->{ARRAY}}, $offset, $length, @list;
+ }
+
+=item UNTIE this
+X<UNTIE>
+
+Will be called when C<untie> happens. (See L<The C<untie> Gotcha> below.)