NAME
Object::Pad::LexicalMethods
- operator for lexical method call syntax
SYNOPSIS
use v5.38;
use Object::Pad;
use Object::Pad::LexicalMethods;
class WithPrivate {
field $var;
my method inc_var { $var++ }
my method dec_var { $var-- }
method bump {
$self->&inc_var;
say "In the middle";
$self->&dec_var;
}
}
DESCRIPTION
Perl version 5.18 added lexical subroutines, which are located in the lexical scope (much like variables declared with my
). Object::Pad version 0.814 supports methods being declared lexically as well, meaning they do not appear in the package namespace of the class, and are not accessible from other scopes. However, Perl does not currently provide a method call syntax for invoking these from the lexical scope while looking like method calls.
This module provides an infix operator for making the syntax of calls to lexical subroutines as if they were methods defined on an object instance look more like named method dispatch syntax.
Support for custom infix operators was added in the Perl 5.37.x development cycle and is available from development release v5.37.7 onwards, and therefore in Perl v5.38 onwards. The documentation of XS::Parse::Infix describes the situation in more detail.
OPERATORS
->&
@result = $instance->&lexmethod( @args );
@result = $instance->&lexmethod;
Invokes a lexical subroutine (that must be visible in the current scope) as if it were a method on instance given by the LHS operand. Arguments may be passed; if so they must be surrounded by parentheses.
This is exactly equivalent to simply invoking the subroutine as a plain function and passing in the instance as the first argument. However, the syntax looks more like regular name-based dispatch method invocation, and is perhaps less surprising to readers as a result. Also, this operator will only accept lexical subroutines as methods; it will reject package-named ones that would otherwise be visible here.
Note that as this is implemented as a single infix operator named ->&
whitespace is not permitted after the arrow but before the ampersand, whereas other arrow-like operators in Perl (such as ->[ ... ]
) do permit this.
AUTHOR
Paul Evans <leonerd@leonerd.org.uk>