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

package Left;

sub left { __PACKAGE__ }
sub both { __PACKAGE__ }

package Right;

sub right { __PACKAGE__ }
sub both { __PACKAGE__ }

package main;

use strict;
use warnings;

use Test::More tests => 32;

{
    use autobox SCALAR => [ qw(Left Right) ];

    ok(42->autobox_class->isa('Left'), 'LR1: isa Left');
    ok(42->autobox_class->isa('Right'), 'LR1: isa Right');

    ok(42->autobox_class->can('left'), 'LR1: can left');
    ok(42->autobox_class->can('both'), 'LR1: can both');
    ok(42->autobox_class->can('right'), 'LR1: can right');

    is(42->left, 'Left', 'LR1: left');
    is(42->both, 'Left', 'LR1: both');
    is(42->right, 'Right', 'LR1: right');
}

{
    use autobox SCALAR => 'Left';
    use autobox SCALAR => 'Right';

    ok(42->autobox_class->isa('Left'), 'LR2: isa Left');
    ok(42->autobox_class->isa('Right'), 'LR2: isa Right');

    ok(42->autobox_class->can('left'), 'LR2: can left');
    ok(42->autobox_class->can('both'), 'LR2: can both');
    ok(42->autobox_class->can('right'), 'LR2: can right');

    is(42->left, 'Left', 'LR2: left');
    is(42->both, 'Left', 'LR2: both');
    is(42->right, 'Right', 'LR2: right');
}

{
    use autobox SCALAR => [ qw(Right Left) ];

    ok(42->autobox_class->isa('Left'), 'RL1: isa Left');
    ok(42->autobox_class->isa('Right'), 'RL1: isa Right');

    ok(42->autobox_class->can('left'), 'RL1: can left');
    ok(42->autobox_class->can('both'), 'RL1: can both');
    ok(42->autobox_class->can('right'), 'RL1: can right');

    is(42->left, 'Left', 'RL1: left');
    is(42->both, 'Right', 'RL1: both');
    is(42->right, 'Right', 'RL1: right');
}

{
    use autobox SCALAR => 'Right';
    use autobox SCALAR => 'Left';

    ok(42->autobox_class->isa('Left'), 'RL2: isa Left');
    ok(42->autobox_class->isa('Right'), 'RL2: isa Right');

    ok(42->autobox_class->can('left'), 'RL2: can left');
    ok(42->autobox_class->can('both'), 'RL2: can both');
    ok(42->autobox_class->can('right'), 'RL2: can right');

    is(42->left, 'Left', 'RL2: left');
    is(42->both, 'Right', 'RL2: both');
    is(42->right, 'Right', 'RL2: right');
}