#! perl -slw use Carp; no warnings 'once'; package Array; use constant { CLASS => 0, SELF => 0, INDEX => 1, VALUE => 2, OFFSET => 1, LENGTH => 2, }; sub TIEARRAY { bless [], $_[CLASS] } sub STORE { warn "STORE: @_"; $_[SELF]->[ $_[INDEX] ] = $_[VALUE] } sub FETCH { warn "FETCH @_"; $_[SELF]->[ $_[INDEX] ] } sub FETCHSIZE { warn "FETCHSIZE: @_"; @{ $_[SELF] } } sub CLEAR { warn "CLEAR: @_"; undef @{ $_[SELF] } } sub STORESIZE { warn "STORESIZE/EXTEND @_"; $#{ $_[SELF] } = $_[INDEX] - 1 } *EXTEND = *STORESIZE; sub EXISTS { warn "EXISTS: @_"; exists $_[SELF]->[ $_[INDEX] ] } sub DELETE { warn "DELETE: @_"; delete $_[SELF]->[ $_[INDEX] ] } sub PUSH { warn "PUSH: @_"; push @{ $_[SELF] }, @_[ 1 .. $#_ ] } sub POP { warn "POP: @_"; pop @{ $_[SELF] } } sub SHIFT { warn "SHIFT: @_"; shift @{ $_[SELF] } } sub UNSHIFT { warn "UNSHIFT: @_"; unshift @{ $_[SELF] }, @_[ 1 .. $#_ ] } sub SPLICE { } package main; tie my @x, 'Array'; my $x = $x[ -1 ]; $x[ -1 ]->meth;