in reply to Re^4: A little overloading conundrum
in thread A little overloading conundrum
I gather that:use warnings; use strict; { package My::A; use overload '-' => \− sub minus { my($x, $y, $swap) = (shift, shift, shift); print "In My::A minus\n"; return ref($x)->new( ($y->isa('My::B') ? $x->[0] - $y->{value} : ($x->[0] - $y->[0]) ) * (1, -1)[$swap] ) } sub new { my($class, $value) = (shift, shift); bless [$value], $class } # We can change My::B outside of My::B, in fact. eval q| package My::B; print "Running the eval in My::A\n"; my $m = My::B->can('minus') or die 'My::B not loaded';# $m + is a reference to My::B::minus(). use overload "-" => sub { my($x, $y, $s) = (shift, shift, + shift); print "From overload sub in My::A eval\n"; return $y->isa('My::A') ? $y->minus($x, 1) : $m->($x, $ +y, $s) } |; } { package My::B; # Can't be changed! use overload '-' => \− sub minus { my($x, $y, $swap) = (shift, shift, shift); print "In My::B::minus\n"; my $subtr = $x->{value} - $y->{value}; return ref($x)->new($swap ? -$subtr : $subtr) } sub new { my($class, $value) = (shift, shift); bless {value => $value}, $class } } my $a0 = My::A->new(16); my $a1 = My::A->new(6); my $b0 = My::B->new(16); my $b1 = My::B->new(6); print "All values assigned\n"; my $r1 = $a0 - $a1; print ref($r1), ' = ', ref($a0), ' - ', ref($a1), "\n\n"; my $r2 = $a0 - $b1; print ref($r2), ' = ', ref($a0), ' - ', ref($b1), "\n\n"; my $r3 = $b1 - $a0; print ref($r3), ' = ', ref($b1), ' - ', ref($a0), "\n\n"; my $r4 = $b0 - $b1; print ref($r4), ' = ', ref($b0), ' - ', ref($b1), "\n\n"; __END__ Outputs: Running the eval in My::A All values assigned In My::A minus My::A = My::A - My::A In My::A minus My::A = My::A - My::B From overload sub in My::A eval In My::A minus My::A = My::B - My::A From overload sub in My::A eval In My::B::minus My::B = My::B - My::B
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^6: A little overloading conundrum
by hv (Prior) on Mar 11, 2026 at 13:33 UTC | |
by syphilis (Archbishop) on Mar 15, 2026 at 14:39 UTC |