I actually don't fully understand the code you've provided, but I'll certainly try to remedy that when I get the chance.

First up, I wanted to remove the "experimental" requirement - assuming it's not a crucial piece of the demo. (I'm not at all familiar with experimental stuff, and I don't have much interest in it.)
I've also added some dumps of some more subtractions.
So, I've arrived at this modified version of choroba's script :
use warnings; use strict; #use experimental qw( signatures ); { package My::A; use overload '-' => \− # sub minus($x, $y, $swap) { ############ Replaced by next line ## sub minus { my($x, $y, $swap) = (shift, shift, shift); return ref($x)->new( ($y->isa('My::B') ? $x->[0] - $y->{value} : ($x->[0] - $y->[0]) ) * (1, -1)[$swap] ) } # sub new($class, $value) { ############ Replaced by next line ## sub new { my($class, $value) = (shift, shift); bless [$value], $class } # We can change My::B outside of B, in fact. eval q{ package My::B; my $m = My::B->can('minus') or die 'My::B not loaded'; use overload "-" => sub { my($x, $y, $s) = (shift, shift, + shift); return $y->isa('My::A') ? $y->minus($x, 1) : $m->($x, +$y, $s) } }; } { package My::B; # Can't be changed! use overload '-' => \− # sub minus($x, $y, $swap) { ############ Replaced by next line ## sub minus { my($x, $y, $swap) = (shift, shift, shift); my $subtr = $x->{value} - $y->{value}; return ref($x)->new($swap ? -$subtr : $subtr) } # sub new($class, $value) { ############ Replaced by next line ## 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); use Data::Dumper; print Dumper A => $a0 - $a1; print Dumper B => $a0 - $b1; print Dumper C => $b0 - $b1; print Dumper D => $b0 - $a1; print Dumper AA => $a1 - $a0; print Dumper BB => $b1 - $a0; print Dumper CC => $b1 - $b0; print Dumper DD => $a1 - $b0;
At this point, I have 2 questions:
1. Where is can documented ?
2. How is it that I can use isa even though no features have been enabled ?

Regarding the first question:
>perldoc -f can No documentation for perl function 'can' found
WRT the second question, the perlop documentation says this regarding isa:
This feature is available from Perl 5.31.6 onwards when enabled by + "use feature 'isa'". This feature is enabled automatically by a "use v5 +.36" (or higher) declaration in the current scope.
I have done neither of those things. Has perl-5.42.0 automatically called that feature for me ? ... or does it automatically call "use v5.36" ?

Cheers,
Rob

In reply to Re^3: A little overloading conundrum by syphilis
in thread A little overloading conundrum by syphilis

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.