NAME
Sub::Meta::Parameters - meta information about parameters
SYNOPSIS
use Sub::Meta::Parameters;
my $p1 = Sub::Meta::Parameters->new(
args => ['Str']
);
$p1->invocant; # => undef;
$p1->invocants; # => [];
$p1->positional; # => [Sub::Meta::Param->new('Str')]
$p1->positional_required; # => [Sub::Meta::Param->new('Str')]
$p1->positional_optional; # => []
$p1->named; # => []
$p1->named_required; # => []
$p1->named_optional; # => []
$p1->nshift; # => 0
$p1->slurpy; # => 0
$p1->args_min; # => 1
$p1->args_max; # => 1
my $x = Sub::Meta::Param->new({ type => 'Int', name => '$x', named => 1 });
my $y = Sub::Meta::Param->new({ type => 'Int', name => '$y', named => 1 });
my $p2 = Sub::Meta::Parameters->new(
nshift => 1,
args => [
'ClassName', $x, $y
]
);
$p2->invocant; # => Sub::Meta::Param->new('ClassName');
$p2->invocants; # => [Sub::Meta::Param->new('ClassName')];
$p2->positional; # => []
$p2->positional_required; # => []
$p2->positional_optional; # => []
$p2->named; # => [$x, $y]
$p2->named_required; # => [$x, $y]
$p2->named_optional; # => []
$p2->nshift; # => 1
$p2->slurpy; # => 0
$p2->args_min; # => 5
$p2->args_max; # => 0+'Inf'
METHODS
new
Constructor of Sub::Meta::Parameters
.
my $p = Sub::Meta::Parameters->new(
args => ['Str'], # required. arguments
nshift => 0, # optional. number of shift arguments
slurpy => 0, # optional. whether get all rest arguments
);
ACCESSORS
args
method args() => ArrayRef[InstanceOf[Sub::Meta::Param]]
Subroutine arguments arrayref.
has_args
method has_args() => Bool
Whether Sub::Meta::Parameters has args or not.
set_args
method set_args(ArrayRef[InstanceOf[Sub::Meta::Param]]) => $self
method set_args(ArrayRef[$sub_meta_param_args]) => $self
method set_args(Dict[Str, $sub_meta_param_args]) => $self
method set_args(Ref $type) => $self
Setter for subroutine arguments. An element can be an argument of Sub::Meta::Param
.
use Types::Standard -types;
my $p = Sub::Meta::Parameters->new(args => []);
$p->set_args([Int,Int]);
$p->set_args([{ type => Int, name => 'num' }]);
# named case:
$p->set_args({ a => Str, b => Str });
$p->set_args({
a => { isa => Str, default => 123 },
b => { isa => Str, optional => 1 }
});
# single ref:
$p->set_args(Str); # => $p->set_args([Str])
all_args
method all_args() => ArrayRef[InstanceOf[Sub::Meta::Param]]
Subroutine invocants and arguments arrayref.
nshift
method nshift() => Enum[0,1]
Number of shift arguments.
set_nshift($nshift)
method nshift(Enum[0,1] $nshift) => $self
Setter for nshift. For example, it is assumed that 1 is specified in the case of methods, and 0 is specified in the case of normal functions.
slurpy
method slurpy() => Maybe[InstanceOf[Sub::Meta::Param]]
Subroutine all rest arguments.
has_slurpy
method has_slurpy() => Bool
Whether Sub::Meta::Parameters has slurpy or not.
set_slurpy($param_args)
method set_slurpy(InstanceOf[Sub::Meta::Param]) => $self> or
method set_slurpy($sub_meta_param_args)> or
Setter for slurpy:
my $p = Sub::Meta::Parameters->new(args => [{ isa => 'Int', name => '$a'}]);
$p->set_slurpy({ name => '@numbers', isa => 'Int' }); # => (Int $a, Int @numbers)
positional
method positional() => ArrayRef[InstanceOf[Sub::Meta::Param]]
Returns an arrayref of parameter objects for the positional arguments.
positional_required
method positional_required() => ArrayRef[InstanceOf[Sub::Meta::Param]]
Returns an arrayref of parameter objects for the required positional arguments.
positional_optional
method positional_optional() => ArrayRef[InstanceOf[Sub::Meta::Param]]
Returns an arrayref of parameter objects for the optional positional arguments.
named
method named() => ArrayRef[InstanceOf[Sub::Meta::Param]]
Returns an arrayref of parameter objects for the named arguments.
named_required
method named_required() => ArrayRef[InstanceOf[Sub::Meta::Param]]
Returns an arrayref of parameter objects for the required named arguments.
named_optional
method named_optional() => ArrayRef[InstanceOf[Sub::Meta::Param]]
Returns an arrayref of parameter objects for the optional named arguments.
invocant
method invocant() => Maybe[InstanceOf[Sub::Meta::Param]]
First element of invocants.
invocants
method invocants() => ArrayRef[InstanceOf[Sub::Meta::Param]]
Returns an arrayref of parameter objects for the variables into which initial arguments are shifted automatically. This will usually return () for normal functions and ('$self') for methods.
has_invocant
method has_invocant() => Bool
Whether Sub::Meta::Parameters has invocant or not.
set_invocant($param_args)
method set_invocant(InstanceOf[Sub::Meta::Param]) => $self
method set_invocant($sub_meta_param_args) => $self
Setter for invocant:
my $invocant = Sub::Meta::Param->new(name => '$self');
my $p = Sub::Meta::Parameters->new(args => []);
$p->set_invocant($invocant);
$p->invocant; # => Sub::Meta::Param->new(name => '$self', invocant => 1);
$p->nshift; # => 1
args_min
method args_min() => NonNegativeInt
Returns the minimum number of required arguments.
This is computed as follows: Invocants and required positional parameters count 1 each. Optional parameters don't count. Required named parameters count 2 each (key + value). Slurpy parameters don't count either because they accept empty lists.
args_max
method args_max() => NonNegativeInt
Returns the maximum number of arguments.
This is computed as follows: If there are any named or slurpy parameters, the result is Inf. Otherwise the result is the number of all invocants and positional parameters.
METHODS
is_same_interface($other_meta)
method is_same_interface(InstanceOf[Sub::Meta::Parameters] $other_meta) => Bool
A boolean value indicating whether Sub::Meta::Parameters
object is same or not. Specifically, check whether args
, nshift
and slurpy
are equal.
is_relaxed_same_interface($other_meta)
method is_relaxed_same_interface(InstanceOf[Sub::Meta::Parameters] $other_meta) => Bool
A boolean value indicating whether Sub::Meta::Parameters
object is same or not. Specifically, check whether args
, nshift
and slurpy
are satisfy the condition of $self
side:
my $meta = Sub::Meta::Parameters->new(args => []);
my $other = Sub::Meta::Parameters->new(args => ["Str"]);
$meta->is_same_interface($other); # NG
$meta->is_relaxed_same_interface($other); # OK. The reason is that $meta does not specify the elements of args.
is_same_interface_inlined($other_meta_inlined)
method is_same_interface_inlined(InstanceOf[Sub::Meta::Parameters] $other_meta) => Str
Returns inlined is_same_interface
string.
is_relaxed_same_interface_inlined($other_meta_inlined)
method is_relaxed_same_interface_inlined(InstanceOf[Sub::Meta::Parameters] $other_meta) => Str
Returns inlined is_relaxed_same_interface
string.
error_message($other_meta)
method error_message(InstanceOf[Sub::Meta::Parameters] $other_meta) => Str
Return the error message when the interface is not same. If same, then return empty string.
relaxed_error_message($other_meta)
method relaxed_error_message(InstanceOf[Sub::Meta::Parameters] $other_meta) => Str
Return the error message when the interface does not satisfy the $self
meta. If match, then return empty string.
display
method display() => Str
Returns the display of Sub::Meta::Parameters:
use Sub::Meta::Parameters;
use Types::Standard qw(Num);
my $meta = Sub::Meta::Parameters->new(
args => [
{ name => '$lat', type => Num, named => 1 },
{ name => '$lng', type => Num, named => 1 },
],
);
$meta->display; # 'Num :$lat, Num :$lng'
OTHERS
param_class
method param_class() => Str
Returns class name of param. default: Sub::Meta::Param Please override for customization.
SEE ALSO
The methods in this module are almost copied from the Function::Parameters::Info
methods.
LICENSE
Copyright (C) kfly8.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
AUTHOR
kfly8 <kfly@cpan.org>