Normalmente la implementación de un operador sobrecargado se busca en el siguiente orden:
nomethod
.
Este orden puede alterarse si se define el pseudo operador fallback
.
Si fallback esta definido y es cierto, la secuencia es la misma que en el caso anterior, excepto que, en vez de generar una excepción, la operación pasa a implementarse siguiendo la conducta normal de Perl para ese operador:
nomethod
Si fallback
esta definido pero es falso, el mecanismo de propagación
de la sobrecarga (anterior paso 2)
es eliminado y la secuencia es:
nomethod
fué definido. Si
es así se llama a la subrutina asociada con nomethod
.
Este último orden proporciona un mecanismo para aquellas situaciones en las que se quiere
evitar el proceso de propagación automática de la sobrecarga. Por ejemplo,
supongamos que queremos sobrecargar la operación de diferencia entre días de la semana
(lunes, martes, ...) de manera que podamos determinar el número de días entre las mismos.
Parece que no tendría sentido usar el operador de negación unaria. Para ello podemos
asociar con el operador neg
una referencia a una subrutina que provoque
una excepción:
package DaysOfTheWeek; use overload "-" => \delta, "nomethod" => sub { croak "No tiene sentido negar un dia de la semana\n" };
Sin embargo, este método es ineficiente si el número de operadores autogenerados cuyo uso se quiere prohibir es grande. Una mejor solución es:
package DaysOfTheWeek; use overload "-" => \delta, "fallback" => 0, "nomethod" => sub { croak "No tiene sentido $_[3]\n" };El cuarto argumento de nomethod es el operador ''realmente'' solicitado (
$_[3]
)
Los argumentos que se pasan a la subrutina asociada con nomethod son:
undef
si no existe)
flag
indicando cuando los operandos fueron intercambiados
$_[3]
)
La sobrecarga puede combinarse con la herencia. Cualquier subclase heredará los métodos de la clase materna y puede sobreescribir cualquier operador a conveniencia.