Moo:尝试重新加载角色已中止

时间:2014-03-13 10:41:57

标签: perl moo

我有一个使用多个(独立)模块的模块,所有这些模块都具有相同的属性(本地化对象的句柄)。我没有将该属性添加到所有类,而是将该属性移动到一个角色,然后由所有顶级类使用。

不幸的是,现在我收到了致命的错误"尝试重新加载'角色'中止" +"在模块/运行时行317"

中的编译失败

我有双重和三重检查,我不会在所有课程中多次使用角色,但我对如何解决问题并发现错误感到有点困惑。由于这很早就失败了(在BEGIN之前/之前),现在有一种方法(我知道)可以调试它。

Moo类的层次结构和消费看起来基本上都是这样的(它可以通过大量代码发布所有内容,但它仍然过多):

主要课程:

SwitchInfo.pm: use Foo::SwitchInfo::DeviceIdent;
SwitchInfo.pm: use Foo::SwitchInfo::Factory;
SwitchInfo.pm: use Foo::SwitchInfo::L10N;
SwitchInfo.pm: use Moo;

角色:

SwitchInfo/Role/L10N.pm: use Moo::Role;

第一级独立课程

SwitchInfo/L10N: use base 'Locale::Maketext';

SwitchInfo/StackTable.pm: use Moo;
SwitchInfo/StackTable.pm: with 'Foo::SwitchInfo::Role::L10N';

SwitchInfo/DeviceIdent.pm: use Moo;
SwitchInfo/DeviceIdent.pm: with 'Foo::SwitchInfo::Role::L10N';

SwitchInfo/NameTable.pm: use Moo;
SwitchInfo/NameTable.pm: with 'Foo::SwitchInfo::Role::L10N';

SwitchInfo/Factory.pm: use Moo;
SwitchInfo/Factory.pm: with 'Foo::SwitchInfo::Role::L10N';

SwitchInfo/AliasTable.pm: use Moo;
SwitchInfo/AliasTable.pm: with 'Foo::SwitchInfo::Role::L10N';

SwitchInfo/Domain.pm: use Moo;

SwitchInfo/Driver.pm: use Foo::SwitchInfo::AliasTable;
SwitchInfo/Driver.pm: use Foo::SwitchInfo::Domain;
SwitchInfo/Driver.pm: use Foo::SwitchInfo::NameTable;
SwitchInfo/Driver.pm: use Foo::SwitchInfo::StackTable;
SwitchInfo/Driver.pm: use Moo;
SwitchInfo/Driver.pm: with 'Foo::SwitchInfo::Role::L10N';

第二级课程的子课程:

SwitchInfo/Driver/Cisco.pm: use Moo;
SwitchInfo/Driver/Cisco.pm: extends 'Foo::SwitchInfo::Driver';

SwitchInfo/Driver/Extreme.pm: use Foo::SwitchInfo::Domain;
SwitchInfo/Driver/Extreme.pm: use Foo::SwitchInfo::Driver::Extreme::NameTable;
SwitchInfo/Driver/Extreme.pm: use Foo::SwitchInfo::Driver::Extreme::StackTable;
SwitchInfo/Driver/Extreme.pm: use Moo;
SwitchInfo/Driver/Extreme.pm: extends 'Foo::SwitchInfo::Driver';

SwitchInfo/Driver/Extreme/StackTable.pm: use Moo;
SwitchInfo/Driver/Extreme/StackTable.pm: extends 'Foo::SwitchInfo::StackTable';

SwitchInfo/Driver/Extreme/NameTable.pm: use Moo;
SwitchInfo/Driver/Extreme/NameTable.pm: extends 'Foo::SwitchInfo::NameTable';

尝试使用主类时,我收到以下错误:

$ cat sw.pl 
use strict;
use warnings;

use lib './lib';
use Foo::SwitchInfo;
$
$ perl sw.pl
Attempt to reload Foo/SwitchInfo/Role/L10N.pm aborted.
Compilation failed in require at /opt/perl5/lib/perl5/Module/Runtime.pm line 317.
Compilation failed in require at lib/Foo/SwitchInfo.pm line 3.
BEGIN failed--compilation aborted at lib/Foo/SwitchInfo.pm line 3.
Compilation failed in require at sw.pl line 5.
BEGIN failed--compilation aborted at sw.pl line 5.
$ 

Foo / SwitchInfo.pm的负责人是(带行号):

 1 package Foo::SwitchInfo;
 2 
 3 use Foo::SwitchInfo::DeviceIdent;
 4 use Foo::SwitchInfo::Factory;
 5 use Foo::SwitchInfo::L10N;
 6 use Types::Standard qw/ ArrayRef InstanceOf Str /;
 7 use Type::Utils qw/ as coerce declare from via /;
 8 
 9 use Foo::SNMP;
10 
11 use Moo;
12 use namespace::clean;

完整的角色是这样的:

package Foo::SwitchInfo::Role::L10N;

use Types::Standard qw/ InstanceOf /;

use Moo::Role;

has l10n => (
  is        => 'ro',
  isa       => InstanceOf['Foo::SwitchInfo::L10N'],
  handles   => qw/ maketext /,
  required  => 1,
);

1;

一个小的测试脚本已经验证了在几个类中使用Role,然后在另一个类中使用这些类没有问题。

如果还有人在阅读这篇长篇文章,你会发现任何问题吗?或者这是一个角色的用途吗?这是我第一次(真正)尝试使用角色,所以我可能已经超出了界限。

1 个答案:

答案 0 :(得分:2)

发现错误。事实证明,我在角色的'handles'指令中有一个拼写错误。

<强>是

handles => qw/ maketext /,

应该是

handles => [ qw/ maketext / ],

通过运行

计算出来
perl -c lib/Foo/SwitchInfo/Role/L10N.pm

大声抱怨

Can't locate maketext.pm in @INC