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>

