Ok, Here goes a more complex example, wich shows it in more details:
use strict;
use warnings;
package Foo::Bar;
sub new {
tie my @arr, 'Foo::Bar';
return bless \@arr, 'Foo::Bar';
}
sub TIEARRAY {
my $scalar = "A Scalar";
return bless \$scalar, 'Foo::Bar';
}
sub FETCH {
my ($self, $index) = @_;
print 'FETCH ';
if ($index == 0) {
return $self->lalala0;
} elsif ($index == 1) {
return $self->lalala1;
} else {
return undef;
}
}
sub STORE {
my ($self, $index, $value) = @_;
print 'STORE ';
if ($index == 0) {
return $self->lalala0($value);
} elsif ($index == 1) {
return $self->lalala1($value);
} else {
return undef;
}
}
sub lalala {
my $self = shift;
if (UNIVERSAL::isa($self,'ARRAY')) { $self = tied(@{$self}) };
print "Lalala $self\n";
}
sub lalala0 {
my $self = shift;
if (UNIVERSAL::isa($self,'ARRAY')) { $self = tied(@{$self}) };
print "Lalala0 $self\n";
}
sub lalala1 {
my $self = shift;
if (UNIVERSAL::isa($self,'ARRAY')) { $self = tied(@{$self}) };
print "Lalala1 $self\n";
}
sub DESTROY {
my $self = shift;
if (UNIVERSAL::isa($self,'ARRAY')) {
print "Destroying the array...\n";
} else {
print "Destroying the scalar...\n";
}
}
package main;
my $a = Foo::Bar->new();
# The object inside is a SCALAR
$a->lalala();
$a->[0] = $a->[1];
$a->[1] = $a->[0];
UPDATE: Included the DESTROY method, to illustrate...