Perl导入所有子类中的一些模块

时间:2014-03-02 00:36:16

标签: perl

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类的每个子类。

1 个答案:

答案 0 :(得分:5)

好的,假设您希望模块Foostrictwarnings导入到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

请参阅?它有效!

现在,这可行的原因是因为strictwarnings非常神奇,并且具有编译时词法效果。在一般情况下 - 比方说,你也想将List::Util qw(first)导入你的调用者,这不那么神奇 - 它不会起作用。但是,Import::Into有一个通用的解决方案,不仅适用于strictwarnings,而且几乎适用于任何模块:

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;