use strict;
END { print "END\n" };
{
package SubRef;
use Scalar::Util qw(weaken refaddr);
sub DESTROY { my $self = shift; print "DESTROY ".ref($self) ."\n" }
sub new {
my $class = shift;
my $copy;
my $self = $copy = bless(sub { $copy->ok }, $class);
weaken $copy;
return $self;
}
sub ok { print "SubRef ok ".refaddr($_[0])."\n" }
}
{
package ArrayRef;
@ArrayRef::ISA = qw(SubRef);
sub new {
my $class = shift;
return bless [], $class;
}
}
{
package CircularRef;
@CircularRef::ISA = qw(SubRef);
sub new {
my $class = shift;
my $s = {};
$s->{self} = $s;
return bless $s, $class;
}
}
for (1..2) {
my $sub = SubRef->new;
my $sub2 = SubRef->new;
my $arr = ArrayRef->new;
my $cir = CircularRef->new;
$sub->();
$sub2->();
}
print "After For\n";
####
paul@paul-laptop:~$ perl foo
SubRef ok 135976352
SubRef ok 135976436
DESTROY ArrayRef
DESTROY SubRef
DESTROY SubRef
SubRef ok 135976352
SubRef ok 135976424
DESTROY ArrayRef
DESTROY SubRef
DESTROY SubRef
After For
END
DESTROY CircularRef
DESTROY CircularRef
####
my $self = $copy = bless(sub :lvalue { $copy->ok; my $n }, $class);