The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/env perl

use strict;
use warnings;

my $main = bless {};

{
    package Method::Lexical::Test;

    use Test::More tests => 25;
    use Data::Dumper;
    our $AUTOLOAD;

    use Method::Lexical {
         AUTOLOAD             => sub { [ 1, $AUTOLOAD, @_ ] },
        'main::AUTOLOAD'      => sub { [ 2, $AUTOLOAD, @_ ] },
        'UNIVERSAL::AUTOLOAD' => sub { [ 3, $AUTOLOAD, @_ ] },
    };

    my $self = bless {};
    my $dumper = Data::Dumper->new([ 1 ]);
    my $foo = 'foo';

    isa_ok($dumper, 'Data::Dumper', 'Data::Dumper::new not clobbered by UNIVERSAL::AUTOLOAD');

    is_deeply(__PACKAGE__->foo(), [ 1, 'Method::Lexical::Test::foo', __PACKAGE__ ]);
    is_deeply($self->foo(), [ 1, 'Method::Lexical::Test::foo', $self ]);
    is_deeply(__PACKAGE__->foo(42), [ 1, 'Method::Lexical::Test::foo', __PACKAGE__, 42 ]);
    is_deeply($self->foo(42), [ 1, 'Method::Lexical::Test::foo', $self, 42 ]);

    is_deeply(__PACKAGE__->$foo(), [ 1, 'Method::Lexical::Test::foo', __PACKAGE__ ]);
    is_deeply($self->$foo(), [ 1, 'Method::Lexical::Test::foo', $self ]);
    is_deeply(__PACKAGE__->$foo(42), [ 1, 'Method::Lexical::Test::foo', __PACKAGE__, 42 ]);
    is_deeply($self->$foo(42), [ 1, 'Method::Lexical::Test::foo', $self, 42 ]);

    is_deeply(main->foo(), [ 2, 'main::foo', 'main' ]);
    is_deeply($main->foo(), [ 2, 'main::foo', $main ]);
    is_deeply(main->foo(42), [ 2, 'main::foo', 'main', 42 ]);
    is_deeply($main->foo(42), [ 2, 'main::foo', $main, 42 ]);

    is_deeply(main->$foo(), [ 2, 'main::foo', 'main' ]);
    is_deeply($main->$foo(), [ 2, 'main::foo', $main ]);
    is_deeply(main->$foo(42), [ 2, 'main::foo', 'main', 42 ]);
    is_deeply($main->$foo(42), [ 2, 'main::foo', $main, 42 ]);

    is_deeply(Data::Dumper->foo(), [ 3, 'Data::Dumper::foo', 'Data::Dumper' ]);
    is_deeply($dumper->foo(), [ 3, 'Data::Dumper::foo', $dumper ]);
    is_deeply(Data::Dumper->foo(42), [ 3, 'Data::Dumper::foo', 'Data::Dumper', 42 ]);
    is_deeply($dumper->foo(42), [ 3, 'Data::Dumper::foo', $dumper, 42 ]);

    is_deeply(Data::Dumper->$foo(), [ 3, 'Data::Dumper::foo', 'Data::Dumper' ]);
    is_deeply($dumper->$foo(), [ 3, 'Data::Dumper::foo', $dumper ]);
    is_deeply(Data::Dumper->$foo(42), [ 3, 'Data::Dumper::foo', 'Data::Dumper', 42 ]);
    is_deeply($dumper->$foo(42), [ 3, 'Data::Dumper::foo', $dumper, 42 ]);
}