请允许我说,我有一个包含以下几个组成部分的代码基:Moose -based levels,我希望它们都使用一套共同的MooseX:*推广单元。 但我不想让每个摩西人阶层开始这样做:
package My::Class;
use Moose;
use MooseX::Aliases;
use MooseX::HasDefaults::RO;
use MooseX::StrictConstructor;
...
相反,我希望每个阶层开始这样做:
package MyClass;
use My::Moose;
并且与上述情况完全相同。
我第一次尝试以(
package My::Moose;
use Moose;
use Moose::Exporter;
use MooseX::Aliases();
use MooseX::StrictConstructor();
use MooseX::HasDefaults::RO();
use Moose::Util::MetaRole;
Moose::Exporter->setup_import_methods(also => [ Moose ]);
sub init_meta {
my $class = shift;
my %params = @_;
my $for_class = $params{for_class};
Moose->init_meta(@_);
MooseX::Aliases->init_meta(@_);
MooseX::StrictConstructor->init_meta(@_);
MooseX::HasDefaults::RO->init_meta(@_);
return $for_class->meta();
}
但是,这一办法并非由民间在“自由、独立、独立、自由、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主、民主 模块:* 例如,试图使用<代码>My:Moose 以上类别:<代码>My:Class 类似:
package My::Class;
use My::Moose;
has foo => (isa => Str );
班次装载时的以下错误结果:
Attribute (foo) of class My::Class has no associated methods (did you mean to provide an "is" argument?)
at /usr/local/lib/perl5/site_perl/5.12.1/darwin-2level/Moose/Meta/Attribute.pm line 1020.
Moose::Meta::Attribute::_check_associated_methods( Moose::Meta::Class::__ANON__::SERIAL::2=HASH(0x100bd6f00) ) called at /usr/local/lib/perl5/site_perl/5.12.1/darwin-2level/Moose/Meta/Class.pm line 573
Moose::Meta::Class::add_attribute( Moose::Meta::Class::__ANON__::SERIAL::1=HASH(0x100be2f10) , foo , isa , Str , definition_context , HASH(0x100bd2eb8) ) called at /usr/local/lib/perl5/site_perl/5.12.1/darwin-2level/Moose.pm line 79
Moose::has( Moose::Meta::Class::__ANON__::SERIAL::1=HASH(0x100be2f10) , foo , isa , Str ) called at /usr/local/lib/perl5/site_perl/5.12.1/darwin-2level/Moose/Exporter.pm line 370
Moose::has( foo , isa , Str ) called at lib/My/Class.pm line 5
require My/Class.pm called at t.pl line 1
main::BEGIN() called at lib/My/Class.pm line 0
eval {...} called at lib/My/Class.pm line 0
因此,我对建议持开放态度,完全无视我未能执行这一建议。 任何战略只要能提供问题开始时所描述的结果,都会受到欢迎。
根据“@Ether”的答复,我现在有以下(也做不到工作):
package My::Moose;
use Moose();
use Moose::Exporter;
use MooseX::Aliases();
use MooseX::StrictConstructor();
use MooseX::HasDefaults::RO();
my %class_metaroles = (
class => [
MooseX::StrictConstructor::Trait::Class ,
],
attribute => [
MooseX::Aliases::Meta::Trait::Attribute ,
MooseX::HasDefaults::Meta::IsRO ,
],
);
my %role_metaroles = (
role =>
[ MooseX::Aliases::Meta::Trait::Role ],
application_to_class =>
[ MooseX::Aliases::Meta::Trait::Role::ApplicationToClass ],
application_to_role =>
[ MooseX::Aliases::Meta::Trait::Role::ApplicationToRole ],
);
if (Moose->VERSION >= 1.9900) {
push(@{$class_metaroles{class}},
MooseX::Aliases::Meta::Trait::Class );
push(@{$role_metaroles{applied_attribute}},
MooseX::Aliases::Meta::Trait::Attribute ,
MooseX::HasDefaults::Meta::IsRO );
}
else {
push(@{$class_metaroles{constructor}},
MooseX::StrictConstructor::Trait::Method::Constructor ,
MooseX::Aliases::Meta::Trait::Constructor );
}
*alias = &MooseX::Aliases::alias;
Moose::Exporter->setup_import_methods(
also => [ Moose ],
with_meta => [ alias ],
class_metaroles => \%class_metaroles,
role_metaroles => \%role_metaroles,
);
样本类别如下:
package My::Class;
use My::Moose;
has foo => (isa => Str );
我发现这一错误:
Attribute (foo) of class My::Class has no associated methods (did you mean to provide an "is" argument?) at ...
样本类别如下:
package My::Class;
use My::Moose;
has foo => (isa => Str , alias => bar );
我发现这一错误:
Found unknown argument(s) passed to foo attribute constructor in Moose::Meta::Attribute : alias at ...