The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Test::More tests => 3;

{
    package BaseTest;
    use Class::C3;
    sub new { bless {} => shift }    
    
    package OverloadingTest;
    use Class::C3;
    use base 'BaseTest';        
    use overload '+'  => sub { die "called plus operator in OT" },
                 fallback => 0;
    
    package InheritingFromOverloadedTest;
    use base 'OverloadingTest';
    use Class::C3;
    use overload '+'  => sub { die "called plus operator in IFOT" },
                 fallback => 1;

    package IFOTX;
    use Class::C3;
    use base 'OverloadingTest';

    package IFIFOT;
    use Class::C3;
    use base 'InheritingFromOverloadedTest';

    package Foo;
    use Class::C3;
    use base 'BaseTest';
    use overload '+'  => sub { die "called plus operator in Foo" },
                 fallback => 1;

    package Bar;
    use Class::C3;
    use base 'Foo';
    use overload '+'  => sub { die "called plus operator in Bar" },
                 fallback => 0;

    package Baz;
    use Class::C3;
    use base 'Bar';
}

Class::C3::initialize();

my $x = IFOTX->new();
eval { $x += 1 };
like($@, qr/no method found,/);

my $y = IFIFOT->new();
eval { $y += 1 };
like($@, qr/called plus operator in IFOT/);

my $z = Baz->new();
eval { $z += 1 };
like($@, qr/no method found,/);