overload.t   [plain text]


print "1.." . &last() . "\n";
use Carp;
$SIG{__WARN__} = sub { warn Carp::longmess(@_) };
use FreezeThaw qw(freeze thaw);

{
  package Overloaded;
  use overload '""' => sub { shift()->[0] };
  sub new { my $p = shift; bless [shift], $p }
}

my $a = new Overloaded 'xyz';
my $f = freeze $a;
print "# '$f'\n";
my ($o) = thaw $f;

print "not " unless "$o" eq 'xyz';
print "ok 1\n";

print "not " unless ref $o eq 'Overloaded';
print "ok 2\n";

$f = freeze [$a, $a];
print "# '$f'\n";
($o) = thaw $f;

print "# '$o->[0]'\nnot " unless "$o->[0]" eq 'xyz';
print "ok 3\n";

print "not " unless $o->[0][0] eq 'xyz';
print "ok 4\n";

print "not " unless ref $o->[0] eq 'Overloaded';
print "ok 5\n";

print "not " unless "$o->[1]" eq 'xyz';
print "ok 6\n";

print "not " unless $o->[1][0] eq 'xyz';
print "ok 7\n";

print "not " unless ref $o->[1] eq 'Overloaded';
print "ok 8\n";

print "not " unless @$o == 2;
print "ok 9\n";

bless $o->[0], 'Something';

print "not " unless ref $o->[0] eq 'Something';
print "ok 10\n";

# SvAMAGIC() is a property of a reference, not of a referent!
# Thus $o->[1] would preserve overloadness unless this:
bless $o->[1], ref $o->[1];

print "not " unless ref $o->[1] eq 'Something';
print "ok 11\n";

print "not " unless $o->[0] == $o->[1];		# Addresses
print "ok 12\n";

sub last {12}