Ces jours-ci, je travaille sur un projet qui utilise Perl et Moose. Je comprends que Moose est construit sur MOP. Je ne suis pas trop familier avec MOP, et j'ai rencontré quelque chose que je ne comprends pas, et j'aurais besoin d'une explication théorique. Voici le module namespace::autoclean
de la documentation :
SYNOPSIS
package Foo;
use namespace::autoclean;
use Some::Package qw/imported_function/;
sub bar { imported_function('stuff') }
# later on:
Foo->bar; # works
Foo->imported_function; # will fail. imported_function got cleaned after compilation
Ainsi, avant que je n'utilise Moose, la façon d'appeler une méthode sur un objet était la suivante : l'interpréteur Perl cherchait cette méthode dans la table des symboles du paquetage dans lequel votre objet était béni (puis, si elle n'était pas trouvée, considérait @ISA
l'héritage et autres). La façon dont il appelle une fonction importée à partir du paquetage est la suivante : il recherche le nom de la fonction dans la table des symboles du paquetage. Pour autant que j'en sois conscient à ce jour, cela signifie que la table des symboles est la même, quelle que soit la façon dont elle est utilisée, donc ce comportement devrait être impossible.
Ma première inspection de la source n'a pas été productive. En gros, qu'est-ce qui est différent dans l'utilisation de Moose, MOP, et namespace::autoclean, pour que ce genre d'artifice devienne possible ?
ed. Pour être particulièrement clair, si je devais remplacer use namespace::autoclean
avec
CHECK { undef *Foo::imported_function }
alors le Foo->bar;
décrit dans la documentation se planterait, car Foo->bar
ne sait pas où trouver imported_function
.