package Acme::Lambda::Expr::Method;
use Moose;
extends qw(Acme::Lambda::Expr::Proc);
has method => (
is => 'ro',
isa => 'Defined',
required => 1,
);
has invocant => (
is => 'ro',
isa => 'Acme::Lambda::Expr::Term',
coerce => 1,
required => 1,
);
sub deparse{
my($self) = @_;
return sprintf '%s->%s(%s)',
$self->invocant->deparse,
$self->method,
join q{, }, map{ $_->deparse } $self->args,
;
}
sub stringify{
my($self) = @_;
return sprintf '%s->%s(%s)',
$self->invocant,
$self->method,
join q{, }, $self->args,
;
}
sub codify{
my($self) = @_;
my $invocant = $self->invocant;
my $method = $self->method;
my @args = $self->args;
return sub{
my $self = &{$invocant};
$self->$method(map{ &{$_} } @args);
# if(not defined $self){
# Carp::croak(qq{Can't call method "$method" on an undefined value});
# }
# elsif(Scalar::Util::looks_like_number $self){
# Carp::croak(qq{Can't call method "$method" without a package or object reference});
# }
#
# my $method_entity = $self->can($method);
#
# if($method_entity){
# @_ = ($self, map{ &{$_} } @args);
# goto &{$method_entity};
# }
# else{
# my $pkg = ref($self) ? ref($self) : $self;
# Carp::croak(qq{Can't locate object method "$method" via package "$pkg"});
# }
};
}
__PACKAGE__->meta->make_immutable;