Perl Moose模块自动将Strict和Warning模块导入任何子类,这来自Moose文档。
我想为我自己的模块实现这个逻辑,我想将自己的模块导入到我的应用程序基础模块子类的每个模块。
以下是示例:
#============================
package MyBaseClass;
use Moose;
has config => (
is => 'rw',
default => sub { {
who => 'World',
} }
);
#============================
package MyClass;
use Moose;
extends qw(MyBaseClass);
sub greet {
my $self = shift;
printf ("Hello %s\n", $self->config->{who});
}
#============================
package MyLib;
use Moose;
extends qw(MyBaseClass);
sub settings {
}
#============================
package main;
my $object = MyClass->new();
$object->greet();
#============================
我希望将packge MyLib导入MyBaseClass类的每个子类。
答案 0 :(得分:5)
好的,假设您希望模块Foo
将strict
和warnings
导入到use Foo
的任何包中。这是你如何做到的:
package Foo;
use strict;
use warnings;
sub import {
strict->import;
warnings->import;
...; # do other stuff
}
1;
现在让我们编写一个脚本来测试它的工作原理:
#!/usr/bin/env perl
use Foo;
$x++; # this will die if strict is in effect
请参阅?它有效!
现在,这可行的原因是因为strict
和warnings
非常神奇,并且具有编译时词法效果。在一般情况下 - 比方说,你也想将List::Util qw(first)
导入你的调用者,这不那么神奇 - 它不会起作用。但是,Import::Into有一个通用的解决方案,不仅适用于strict
和warnings
,而且几乎适用于任何模块:
package Foo;
use strict;
use warnings;
use List::Util;
use Import::Into;
sub import {
my $target = caller;
strict->import::into($target);
warnings->import::into($target);
List::Util->import::into($target, qw(first));
...; # do other stuff
}
1;
我的模块Syntax::Collector执行类似的技巧。以下是您使用它的方式:
package Foo;
use Syntax::Collector -collect => q{
use strict 0;
use warnings 0;
use List::Util 0 qw(first);
};
1;