#!/usr/bin/perl

package My;

use strict;

use Acme::Sub::Parms qw(:no_validation);
use Class::ParmList qw (simple_parms);
use Params::Validate qw (validate);
use Benchmark qw(cmpthese);
$Params::Validate::NO_VALIDATION = 1;
print "Bench case sensitive parameter parsing without validation (as applicable)\n";
cmpthese(1000000, {
            'bindparms'     => sub { sub_parms_bindparms( handle => 'Test', 'thing' => 'something')},
            'std_args'            => sub { std_args( handle => 'Test', 'thing' => 'something')},
#            'caseflat_args'   => sub { caseflat_std_args( handle => 'Test', 'thing' => 'something')},
            'one_step_args'    => sub { one_step_args( handle => 'Test', 'thing' => 'something')},
            'positional_args'  => sub { positional_args( 'Test', 'something')},
            'simple_parms (*)'     => sub { simple_parms_args( handle => 'Test', 'thing' => 'something')},
            'validate'  => sub { params_validate( handle => 'Test', 'thing' => 'something')},
            'null_sub'         => sub { null_sub( handle => 'Test', 'thing' => 'something')},
#            'null_method'      => sub { null_method( handle => 'Test', 'thing' => 'something')},
        }
);
print "\n(*) case insensitive and validating\n";
exit;

############################################################################

sub params_validate {
    my ($handle, $thing) = @{(validate(@_, { handle => 1, thing => 1 }))}{'handle','thing'};
}

sub sub_parms_bindparms {
    BindParms : (
        my $handle : handle;
        my $thing  : thing;
    )
}

sub simple_parms_args {
    my ($handle, $thing) =  simple_parms(['handle','thing'], @_);
}

sub positional_args {
    my ($handle, $thing) =  @_;
}

sub one_step_args {
    my ($handle, $thing) =  @{{@_}}{'handle','thing'};
}

sub caseflat_std_args {
    my %args;
    {
        my %raw_args = @_;
        %args = map { lc($_) => $raw_args{$_} } keys %raw_args;
    }

    my ($handle, $thing) =  @args{'handle','thing'};
}

sub std_args {
    my %args = @_;
    my ($handle, $thing) =  @args{'handle','thing'};
}
sub null_sub { }
sub null_method { }