Если файл уже загружен, можно ли как-то подключиться к use/require
, чтобы я мог создать исключение? В моем предстоящем nextgen::blacklist
я пытаюсь умереть если используются определенные модули. Я использую метод объектного хука, как упоминалось в perldoc -f require
: есть три подобных хука: объект, массив с подссылкой и подссылка. Примером в этом посте является хук объекта, вы можете найти мою попытку хука sub-ref в nextgen::blacklist
.
Синтаксис, который я хочу, выглядит примерно так:
perl -Mnextgen -E"use NEXT"
package Foo;
use nextgen;
use NEXT;
В идеале должно выдаваться такое сообщение:
nextgen::blacklist violation with import attempt for: [ NEXT (NEXT.pm) ] try 'use mro' instead.
Я пробовал это кучей разных способов.
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;
Кажется, что %INC
устанавливается только после этих хуков. Меня интересует все, что позволит мне создать исключение. Если предпринята попытка загрузить/перезагрузить модуль, несмотря на его статус зависимости от других модулей, которые не используют мою прагму, я хочу умереть.
package Foo;
use NEXT;
package main;
use Foo; (which uses Next.pm);
use NEXT.pm; ## Throw exception