The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More;

{
    package Mock;
    use Sub::Args;
    sub new {bless {}, +shift}
    sub foo {
        my @args = args_pos(1,1,0);
    }
}

subtest 'ok case' => sub {
    is_deeply [Mock->foo(1,2,3)], [qw/1 2 3/];
    is_deeply [Mock->foo(1,2)], [1,2,undef];
};

subtest 'ok case/obj' => sub {
    my $obj = Mock->new;
    is_deeply [$obj->foo(1,2,3)], [qw/1 2 3/];
    is_deeply [$obj->foo(1,2)], [1,2,undef];
};

subtest 'error case' => sub {
    eval {
        Mock->foo(1,2,3,4,5);
    };
    like $@, qr/too much arguments. This function requires only 3 arguments./;

    eval {
        Mock->foo(1);
    };
    like $@, qr/missing mandatory parameter. pos: 1/;
};

done_testing;