[% setvar title Data: overloading via the SECOND operand if needed %]
To see what is currently happening visit http://www.perl6.org/
Data: overloading via the SECOND operand if needed
Maintainer: Ilya Zakharevich <firstname.lastname@example.org> Date: 15 Sep 2000 Mailing List: email@example.com Number: 234 Version: 1 Status: Developing
This RFC proposes a support of a situation when a more-knowledgable module may steal overloading from a less-knowledgable module or visa versa;
The problem: if both arguments to a binary operation are overloaded objects, then with the current implementation the overloaded method registered for the first argument is loaded.
Sometimes it leads to problems: for example,
Math::BigFloat objects support
Math::BigInt objects as the other arguments for binary operations, but
not visa versa, so
print $bigfloat + $bigint; # Works print $bigint + $bigfloat; # Does not
Solution: provide a pragma to inform the overloading mechanism that
Math::BigFloat is more versatile than
use overload ':override', 'Math::BigFloat', 'Math::BigInt';
This would make
$bigint * $bigfloat
(assuming that the MULTIPLY methods are registered for
This requires additional costly checks from the overloading engine. However, it is not hard to implement this with the following features:
no cost if not used in the script;
almost no cost if the first and the second argument are in the same package;
almost no cost if the second argument is does not override anything;
almost no cost if the first argument is not overriden by anything;
in the worst case: costs a hash lookup in a hash.
Given this, the additional overhead of the hash lookup incurs only if needed, this may be ignored.
Overriding does not chain automatically, but if
:override_chain is used
:override, the overrider will also override packages overriden
by the package it overrides.
A method to query overriding info should be provided.
Keep a global flag whether override was ever requested. Keep a flag in each package whether it is overrided by anything. Keep a hash of packages which the given package overrides. Keep these data in the overloading table of the package.