#!/usr/bin/perl

package My;

use strict;

use Acme::Sub::Parms qw(:no_validation :normalize);
use Class::ParmList qw (simple_parms parse_parms);
use Params::Validate qw (validate);
use Benchmark qw(cmpthese);
$Params::Validate::NO_VALIDATION = 1;
print "Bench case insensitive parameter parsing without validation\n";
cmpthese(500000, {
            'bindparms'     => sub { sub_parms_bind_parms( handle => 'Test', 'thing' => 'something')},
#            'std_args'            => sub { standard_args( handle => 'Test', 'thing' => 'something')},
            'caseflat_std_args'   => sub { caseflat_standard_args( handle => 'Test', 'thing' => 'something')},
#            'one_step_args'    => sub { one_step_args( handle => 'Test', 'thing' => 'something')},
            'positional_args'  => sub { positional_args( 'Test', 'something')},
            'null_sub'         => sub { null_sub( handle => 'Test', 'thing' => 'something')},
            'simple_parms'     => sub { simple_parms_args( handle => 'Test', 'thing' => 'something')},
            'parse_parms'     => sub { parse_parms_no_valid( handle => 'Test', 'thing' => 'something')},
            'params_validate'  => sub { params_validate( handle => 'Test', 'thing' => 'something')},
        }
);
exit;

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

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

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

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

sub parse_parms_no_valid {
	my ($handle, $thing) = parse_parms({ -parms    =>  \@_ })->get('handle','thing');
}

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

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

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

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