Si un fichier est déjà chargé, est-il possible de se connecter au use/require
afin de pouvoir lancer une exception? Dans mon prochain nextgen::blacklist
, j'essaye de mourir si certains modules sont utilisés. J'utilise la méthode object-hook comme mentionné dans perldoc -f require
: il y a trois crochets comme objet, tableau avec subref, et sous-réf. L'exemple dans ce post est le crochet d'objet, vous pouvez trouver ma tentative du crochet sous-réf dans nextgen::blacklist
.Comment puis-je me connecter à Perl's use/require pour pouvoir lancer une exception?
La syntaxe je désire est quelque chose comme:
perl -Mnextgen -E"use NEXT"
package Foo;
use nextgen;
use NEXT;
Idéalement, il est censé jeter un message comme celui-ci:
nextgen::blacklist violation with import attempt for: [ NEXT (NEXT.pm) ] try 'use mro' instead.
J'ai essayé ce un tas de façons différentes.
package Class;
use Data::Dumper;
use strict;
use warnings;
sub install {
unshift @main::INC, bless {}, __PACKAGE__
unless ref $main::INC[0] eq __PACKAGE__
;
}
sub reset_cache { undef %main::INC }
sub Class::INC {
my ($self, $pmfile) = @_;
warn Dumper [\%main::INC, $pmfile];
#undef %INC;
}
package main;
BEGIN { Class->install; undef %main::INC }
use strict;
use strict;
use strict;
use strict;
use warnings;
use strict;
use warnings;
Il semble que %INC
n'est mis après ces crochets. Je suis intéressé par tout ce qui me permettra de faire une exception. Si une tentative est faite pour charger/recharger un module, son statut en tant que dépendance d'autres modules qui n'utilisent pas mon pragma, je veux mourir.
package Foo;
use NEXT;
package main;
use Foo; (which uses Next.pm);
use NEXT.pm; ## Throw exception
Merci pour les mots d'encouragement, j'ai essayé de mettre un coderef dans '@ INC', consultez [nextgen :: blacklist] (http://github.com/EvanCarroll/nextgen/tree/blacklist/lib/nextgen /), pour cette tentative. Il y a trois hooks qui semblent tous fournir cette fonctionnalité (array w/coderef, object, et coderef), aussi dans le perldoc que vous référencez. –
Alors quel est le problème? Je viens d'ajouter un petit exemple de cela à ma réponse, et cela fonctionne comme prévu. – rafl
Par titre, (et texte) Si NEXT est inclus par une dépendance, je veux toujours 'utiliser NEXT' pour lancer une exception. Cela signifie que si vous utilisez Foo.pm, qui dépend de 'NEXT'. Je ne veux toujours pas que NEXT soit autorisé. Mais, je ne veux pas que l'include pour Foo.pm provoque une exception. –