Sub-Params
view release on metacpan or search on metacpan
lib/Sub/Params.pm view on Meta::CPAN
# © 2017-2018 GoodData Corporation
use 5.006;
use strict;
use warnings;
package Sub::Params;
our $VERSION = '1.0.0';
use parent 'Exporter';
use Hash::Util qw[];
use Ref::Util qw[ is_plain_hashref ];
our @EXPORT_OK = (
'named_or_positional_arguments'
);
sub named_or_positional_arguments {
my (%args) = @_;
my $args = $args{args};
my $names = $args{names};
return unless $args;
return unless @$args;
return @$args unless @$names;
# Use restricted hashes to detects how function was called
my %params;
Hash::Util::lock_keys %params, @$names;
local $@;
local $SIG{__DIE__};
# single argument, hashref => can be named argument hashref
return %params
if @$args == 1
and is_plain_hashref( $args->[0] )
and eval { %params = %{ $args->[0] }; 1 }
;
# with even number of argument => looks like named arguments
return %params
if @$args % 2 == 0
and eval { %params = @$args; 1 }
;
# with more arguments than names should be named arguments
return %params
if @$args <= @$names
and do { @params{@$names} = @$args; 1 }
;
return @$args;
}
1;
__END__
=encoding utf-8
=head1 NAME
Sub::Params - Handle function arguments
=head1 SYNOPSIS
use Sub::Params qw[ named_or_positional_arguments ];
sub foo {
my ($self, @args) = @_;
my %args = named_or_positional_arguments(
( run in 0.840 second using v1.01-cache-2.11-cpan-99c4e6809bf )