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 <[email protected]>