Sub::Infix creates fake infix operators using overloading. It doesn't use source filters, or
Devel::Declare, or any of that magic. (Though Devel::Declare isn't magic enough to define infix operators
anyway; I know; I've tried.) It's pure Perl, has no non-core dependencies, and runs on Perl 5.6.
The price you pay for its simplicity is that you cannot define an operator that can be used like this:
my $five = 2 plus 3;
Instead, the operator needs to be wrapped with real Perl operators in one of three ways:
my $five = 2 |plus| 3;
my $five = 2 /plus/ 3;
my $five = 2 <<plus>> 3;
The advantage of this is that it gives you three different levels of operator precedence.
You can also call the function a slightly less weird way:
my $five = plus->(2, 3);
Howdoesitwork?
"2 |plus| 3" is parsed by perl as: "2 | ( &plus() | 3 )".
&plus() returns an object that overloads the "|" operator; let's call that $obj.
The overloaded "$obj | 3" operation stashes 3 inside $obj noting that the number is the right operand,
and returns $obj.
Then "2 | $obj" is evaluated, stashing 2 inside $obj as the left operand. At this point, the object
notices that it has both operands, and calls the coderef from the definition of the operator, passing it
both operands.