Sub-Meta
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Sub/Meta/Returns.pm view on Meta::CPAN
package Sub::Meta::Returns;
use 5.010;
use strict;
use warnings;
our $VERSION = "0.15";
use Scalar::Util ();
use overload
fallback => 1,
eq => \&is_same_interface
;
sub new {
my ($class, @args) = @_;
my $v = $args[0];
my %args = @args == 1 ? ref $v && ref $v eq 'HASH' ? %{$v}
: ( scalar => $v, list => $v, void => $v )
: @args;
return bless \%args => $class;
}
sub scalar() :method { my $self = shift; return $self->{scalar} } ## no critic (ProhibitBuiltinHomonyms)
sub list() { my $self = shift; return $self->{list} }
sub void() { my $self = shift; return $self->{void} }
sub coerce() { my $self = shift; return $self->{coerce} }
sub has_scalar() { my $self = shift; return defined $self->{scalar} }
sub has_list() { my $self = shift; return defined $self->{list} }
sub has_void() { my $self = shift; return defined $self->{void} }
sub has_coerce() { my $self = shift; return defined $self->{coerce} }
sub set_scalar { my ($self, $v) = @_; $self->{scalar} = $v; return $self }
sub set_list { my ($self, $v) = @_; $self->{list} = $v; return $self }
sub set_void { my ($self, $v) = @_; $self->{void} = $v; return $self }
sub set_coerce { my ($self, $v) = @_; $self->{coerce} = $v; return $self }
sub is_same_interface {
my ($self, $other) = @_;
return unless Scalar::Util::blessed($other) && $other->isa('Sub::Meta::Returns');
if ($self->has_scalar) {
return unless _eq($self->scalar, $other->scalar)
}
else {
return if $other->has_scalar
}
if ($self->has_list) {
return unless _eq($self->list, $other->list)
}
else {
return if $other->has_list
}
if ($self->has_void) {
return unless _eq($self->void, $other->void)
}
else {
return if $other->has_void
}
return !!1;
}
sub is_relaxed_same_interface {
my ($self, $other) = @_;
return unless Scalar::Util::blessed($other) && $other->isa('Sub::Meta::Returns');
if ($self->has_scalar) {
return unless _eq($self->scalar, $other->scalar)
}
if ($self->has_list) {
return unless _eq($self->list, $other->list)
}
if ($self->has_void) {
view all matches for this distributionview release on metacpan - search on metacpan
( run in 1.420 second using v1.00-cache-2.02-grep-82fe00e-cpan-f73e49a70403 )