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>