NAME

Attribute::Overload::Match - argument-dependent handlers for overloaded operators

DESCRIPTION

The module is a wrapper for overload, that provides a simple syntax for calling different operator handlers for different passed arguments. The idea is a curious ( but probably not a very practical ) mix of Attribute::Overload and Sub::PatMat .

SYNOPSIS

use Attribute::Overload::Match;

Suppose we declare a class that overloads operations on integers:

sub new($)               { my $x = $_[0]; bless \$x, __PACKAGE__ }
sub val($)               { ${$_[0]} }
sub eq       : op(==)    { val(shift) == shift }
sub subtract : op(-)     { new val(shift) - shift }
sub mul      : op(*)     { new val(shift) * shift }
sub add      : op(+)     { new val(shift) + shift }
sub qq       : op("")    { val(shift) }
sub le       : op(<)     { val(shift) < shift }
...

then we can change meaning of some operators with a touch of functional style:

no warnings 'redefine';
sub fac      : op(!,1)   { new 1 }
sub fac      : op(!)     { !($_[0] - 1) * $_[0] }

or

sub fib      : op(~,<2)  { new 1 }
sub fib      : op(~)     { ~( $_[0] - 1) + ~($_[0] - 2) }

(if you don't like no warnings 'redefine', just use different sub names for fac etc) thus

my $x = !new(10);
print "$x\n";
3628800    

and

my $x = ~new(10);
print "$x\n";
89

SYNTAX

The only syntax available here is syntax that is passed to op attributes, which is in general sub mysub : op(OPERATOR,CODE[,CODE[,CODE ...]]), where OPERATOR belongs to strings defined in overload ( such as +, [], "" etc), and CODE strings are perl code, matching a parameter. However, for the sake of readability, CODE can be also one of the following signatures:

Empty string

Parameter is never checked

String starting with a digit

Pataremeter must be defined and be equal (==) to the value if the string

Single-quoted string

Parameter must be defined and be equal (eq) to the value if the string

Non-quoted string beginning with a capital letter

The string defined as a class name. Parameter must be defined and be an instance of the class (or its descendant).

//

Parameter must be defined.

One of <,>,lt,gt,eq,==,ne,!= followed by an expression

Parameter must be defined and return true when compared with the expression using given comparison operator

Anything else

Anything else is passed directly to eval and is treated in a boolean context thereafter.

ACKNOWLEDGEMENTS

Thanks to Anton Berezin for ideas on Sub::PatMat . Thanks to H. Merijn Brandt for //.

SEE ALSO

Attribute::Overload, Sub::PatMat, overload.

COPYRIGHT

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

AUTHOR

Dmitry Karasik <dmitry@karasik.eu.org>