Sub-Meta
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Sub/Meta/Parameters.pm view on Meta::CPAN
package Sub::Meta::Parameters;
use 5.010;
use strict;
use warnings;
our $VERSION = "0.15";
use Carp ();
use Scalar::Util ();
use Sub::Meta::Param;
use overload
fallback => 1,
eq => \&is_same_interface
;
sub _croak { require Carp; goto &Carp::croak }
sub param_class { return 'Sub::Meta::Param' }
sub new {
my ($class, @args) = @_;
my %args = @args == 1 ? %{$args[0]} : @args;
my $self = bless \%args => $class;
$self->set_args($args{args}) if exists $args{args};
$self->set_invocant(delete $args{invocant}) if defined $args{invocant};
$self->set_nshift(delete $args{nshift}) if defined $args{nshift};
$self->set_slurpy(delete $args{slurpy}) if defined $args{slurpy};
return $self;
}
sub nshift() { my $self = shift; return $self->{nshift} // 0 }
sub slurpy() { my $self = shift; return $self->{slurpy} }
sub args() { my $self = shift; return $self->{args} // [] }
sub invocant() { my $self = shift; return $self->{invocant} }
sub invocants() { my $self = shift; return $self->has_invocant ? [ $self->{invocant} ] : [] }
sub all_args() { my $self = shift; return [ @{$self->invocants}, @{$self->args} ] }
sub has_args() { my $self = shift; return defined $self->{args} }
sub has_invocant() { my $self = shift; return defined $self->{invocant} }
sub has_slurpy() { my $self = shift; return defined $self->{slurpy} }
sub set_slurpy {
my ($self, $v) = @_;
$self->{slurpy} = Scalar::Util::blessed($v) && $v->isa('Sub::Meta::Param')
? $v
: $self->param_class->new($v);
return $self;
}
sub set_args {
my ($self, @args) = @_;
$self->{args} = $self->_normalize_args(@args);
return $self;
}
sub set_nshift {
my ($self, $v) = @_;
unless (defined $v && ($v == 0 || $v == 1) ) {
_croak sprintf("Can't set this nshift: %s", $v//'');
}
$self->{nshift} = $v;
if ($v == 1 && !defined $self->invocant) {
my $default_invocant = $self->param_class->new(invocant => 1);
$self->set_invocant($default_invocant)
}
if ($v == 0 && defined $self->invocant) {
delete $self->{invocant}
}
return $self;
}
sub set_invocant {
my ($self, $v) = @_;
my $invocant = Scalar::Util::blessed($v) && $v->isa('Sub::Meta::Param')
? $v
: $self->param_class->new($v);
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.621 second using v1.00-cache-2.02-grep-82fe00e-cpan-f73e49a70403 )