use strict; use warnings; package SelectiveOverload; use overload; my $package_suffix = 'a'; sub new { my $class = shift; my $overload = shift; my $package = __PACKAGE__; my $new_package = join '::', $package, $package_suffix++; my $mkpackage = <<"SELECTIVE_OVERLOAD"; package $new_package; overload->import( \%{\$overload} ); \@$new_package\::ISA = ( '$package' ); SELECTIVE_OVERLOAD eval $mkpackage; die $@ if $@; return bless {}, $new_package; } package main; use Test::More 'tests' => 9; use Scalar::Util qw( reftype ); my $over_array_called = 0; my $over_array = SelectiveOverload->new( { '@{}' => sub { $over_array_called = 1; [] } } ); isa_ok( $over_array, 'SelectiveOverload' ); ok( !$over_array_called, 'array overload sub not called' ); my @x = @{$over_array}; ok( $over_array_called, 'array overload sub was called' ); ok( !eval { my $test = ${$over_array}; 1 }, 'dereference scalar on $over_array fails' ); $over_array_called = 0; my $over_scalar_called = 0; my $over_scalar = SelectiveOverload->new( { '${}' => sub { $over_scalar_called = 1; \my $x } } ); isa_ok( $over_scalar, 'SelectiveOverload' ); ok( !$over_scalar_called, 'scalar overload sub not called' ); my $x = ${$over_scalar}; ok( $over_scalar_called, 'scalar overload sub was called' ); ok( !eval { my @test = @{$over_scalar}; 1 }, 'dereference array on $over_scalar does not work' ); ok( !$over_array_called, 'array overload sub not called' );