Historia del tema:
La OOP en Perl se basa en paquetes (package) y la vinculación de referencias a través de la función bless. La herencia se logra gracias al array @ISA, que determina automáticamente en qué paquetes Perl buscará los métodos. El mecanismo de búsqueda implementa lo que se llama MRO (orden de resolución de métodos).
Problema:
La gestión caótica del array @ISA y el uso de SUPER sin comprender el orden de búsqueda de métodos a menudo conducen a errores, llamadas dobles o la incapacidad de sobrescribir la funcionalidad deseada. El uso de AUTOLOAD requiere control para evitar trampas de ciclos de búsqueda infinitos.
Solución:
Ejemplo de código:
package Animal; sub speak { print "El animal habla "; } package Dog; our @ISA = qw(Animal); sub speak { print "¡El perro ladra! "; shift->SUPER::speak(); # llamado al método parent } my $dog = bless {}, 'Dog'; $dog->speak;
Características clave:
Si en la cadena de herencia hay varios paquetes parent con los mismos nombres de métodos, ¿cuál será llamado?
La búsqueda se realiza de izquierda a derecha (en el orden de declaración en @ISA), se llama al primer método encontrado.
¿Qué ocurrirá si un método específico no existe en todo el árbol de herencia, y AUTOLOAD está implementado solo en uno de los padres?
Perl llamará a AUTOLOAD solo de la clase en la que lo encuentre primero en la cadena de búsqueda de métodos. Los demás AUTOLOAD no funcionarán si no se encuentran antes en @ISA.
¿Se puede cambiar el orden de búsqueda del método en tiempo de ejecución?
Técnicamente se puede modificar el array @ISA en tiempo de ejecución, pero esto lleva a fragilidad y errores difíciles de rastrear. Este enfoque se recomienda solo para casos específicos.
Se utilizan varios clases parent con los mismos nombres de métodos, su orden en @ISA cambia de manera impredecible a mano, los métodos llaman a SUPER, lo que lleva a recursión infinita.
Pros:
Contras:
Modificaciones solo a través de la declaración explícita de @ISA, y al ser necesario hacer herencia múltiple, usar módulos especializados como mro::Concise o Class::C3.
Pros:
Contras: