No estoy pensando demasiado claro en este momento y posiblemente pasando por alto algo simple. He estado pensando en esto por un tiempo y he estado buscando, pero realmente no puedo pensar en ninguna consulta de búsqueda sensata que me lleve a lo que busco.¿Cuál es la forma más limpia de duplicar la funcionalidad de base/parent.pm para módulos perl sin objetos?
En resumen, me pregunto cómo hacer la herencia del módulo, en la forma en que base.pm/parent.pm lo hace para los módulos orientados a objetos; solo para módulos basados en Exportador.
Un ejemplo hipotético de lo que quiero decir:
Aquí está nuestro guión. Originalmente cargó Foo.pm y llamó a baz(), pero baz() tiene un error terrible (como veremos enseguida), por lo que estamos usando Local/Patched/Foo.pm ahora, que debería arreglar el error. Estamos haciendo esto, porque en este caso hipotético no podemos cambiar a Foo (es un módulo de Cpan en desarrollo activo, como ve), y es enorme (en serio).
#!/usr/bin/perl
# use Foo qw(baz [... 100 more functions here ...]);
use Local::Patched::Foo qw(baz [... 100 more functions here ...]);
baz();
Aquí está Foo.pm. Como puede ver, exporta baz(), que llama a qux, que tiene un error terrible, que hace que las cosas se cuelguen. Sin embargo, queremos mantener Baz y el resto de Foo.pm, sin hacer una tonelada de copiar y pegar, especialmente porque podrían cambiar más adelante, debido a que Foo aún está en desarrollo.
package Foo;
use parent 'Exporter';
our @EXPORT = qw(baz [... 100 more functions here ...]);
sub baz { qux(); }
sub qux { print 1/0; } # !!!!!!!!!!!!!
[... 100 more functions here ...]
1;
Por último, ya Foo.pm se utiliza en lugares MUCHOS, no queremos utilizar Sub :: exportador, ya que eso significaría copiar y pegar una solución curita a todas aquellas muchos lugares. En cambio, estamos tratando de crear un nuevo módulo que actúe y se parezca a Foo.pm, y de hecho cargue el 99% de su funcionalidad aún de Foo.pm y simplemente reemplace el sub de feo qux por uno mejor.
Lo que sigue es lo que tal cosa se vería como si Foo.pm estaba orientado a objetos:
package Local::Patched::Foo;
use parent 'Foo';
sub qux { print 2; }
1;
Ahora bien, esto obviamente no va a funcionar en nuestro caso actual, ya parent.pm simplemente no hace esta algo.
¿Existe un método simple y limpio para escribir Local/Patched/Foo.pm (usando cualquier módulo de CPAN aplicable) de una manera que funcione, excepto copiar el espacio de nombres de funciones de Foo.pm manualmente?
La moraleja de la historia es que se ahorrará mucho dolor más adelante si se llama a todas sus funciones de biblioteca como 'Class-> foo', en lugar de' Class :: foo'. :) – Ether
Estoy confundido con lo que quieres decir con eso, ya que yo tampoco estoy aquí. : o Realmente estoy tratando de encontrar lo que dice el título de la pregunta, un equivalente sensato de parent/base.pm en el mundo funcional. (Ya que realmente no me gusta la programación orientada a objetos.;)) – Mithaldu
@mithaldu: se aclarará en mi post a continuación. – Ether