Búsqueda del Manejador con fallback Falso

Si fallback esta definido pero es falso, el mecanismo de propagación de la sobrecarga (anterior paso 2) es eliminado y la secuencia es:

  1. Si el operador ha sido explícitamente sobrecargado se llama a la correspondiente subrutina
  2. En otro caso, se mira a ver si el pseudo operador nomethod fué definido. Si es así se llama a la subrutina asociada con nomethod.
  3. En cualquier otro caso generar una excepción

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])

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19