Perl 是否有任何方法可以从Moose对象中使用Moose::Exporter?

Perl 是否有任何方法可以从Moose对象中使用Moose::Exporter?,perl,export,moose,Perl,Export,Moose,我正在寻找一种从父类而不是独立的实用程序类中设置一些助手方法的方法。如果可能的话,这将是一种更透明的向模块中添加驼鹿糖的方法,因为它不需要明确地要求任何助手模块(因为所有内容都将通过extends声明) 基于这一点,这大致就是我想要的: package Parent; use Moose; Moose::Exporter->setup_import_methods( with_meta => [ 'has_rw' ], as_is => [ 'thi

我正在寻找一种从父类而不是独立的实用程序类中设置一些助手方法的方法。如果可能的话,这将是一种更透明的向模块中添加驼鹿糖的方法,因为它不需要明确地要求任何助手模块(因为所有内容都将通过
extends
声明)

基于这一点,这大致就是我想要的:

package Parent;

use Moose;

Moose::Exporter->setup_import_methods(
    with_meta => [ 'has_rw' ],
    as_is     => [ 'thing' ],
    also      => 'Moose',
);

sub has_rw {
    my ( $meta, $name, %options ) = @_;
    $meta->add_attribute(
        $name,
        is => 'rw',
        %options,
    );
}

# then later ...
package Child;

use Moose;
extends 'Parent';

has 'name';
has_rw 'size';
thing;
但是,这不起作用:

perl -I. -MChild -wle'$obj = Child->new(size => 1); print $obj->size'
在Child.pm第10行“has_rw'size”附近找到运算符所需的字符串 (您是否需要提前预订 Child.pm第10行“has_rw'size”附近的语法错误 在Child.pm第12行使用“strict subs”时,不允许使用裸词“thing”。 在require中编译失败。 BEGIN失败--编译中止。
另外,我还尝试将导出魔法移动到一个角色中(
with role;
,而不是
extends Parent;
),但同样的错误也会发生。

这不受支持,原因很充分。类或角色与sugar方法不同,在某种程度上,不同的东西应该是不同的。如果您的问题是必须“使用”Moose+自定义糖包,那么您可以通过简单地让自定义糖包也导出Moose来解决,从您的示例中借鉴:

package MySugar;
use strict;
use Moose::Exporter;

Moose::Exporter->setup_import_methods(
    with_meta => [ 'has_rw' ],
    as_is     => [ 'thing' ],
    also      => 'Moose',
);

sub has_rw {
    my ( $meta, $name, %options ) = @_;
    $meta->add_attribute(
        $name,
        is => 'rw',
        %options,
    );
}
然后你简单地说:

package MyApp;
use MySugar; # imports everything from Moose + has_rw and thing    
extends(Parent);

has_rw 'name';
has 'size';
thing;
这就是
MooseX::POE
以及其他几个软件包的工作原理。就我个人而言,我反对让
扩展
像你在这里建议的那样引入sugar,因为类不是一堆sugar函数,这两个函数真的不应该混淆

更新:要同时引入两者,最干净的方法是将父对象作为应用于Moose::Object的角色重新编写

package Parent::Methods;
use 5.10.0;
use Moose::Role;

sub something_special { say 'sparkles' }
然后,我们只需将MySugar中对Moose::Exporter的调用更改为

Moose::Exporter->setup_import_methods(
    apply_base_class_roles => 'Parent::Methods',
    with_meta              => ['has_rw'],
    as_is                  => ['thing'],
    also                   => 'Moose',
);
现在你可以简单地说

package MyApp;
use MySugar; 

has_rw 'name';
has 'size';
thing;

package main;
MyApp->new->something_special; # prints sparkles

这就是我相信你想要的最后一个细节。

我想要的是将
Parent
MySugar
组合成一个类,因为糖是专门设计来构建在
Parent
中定义的组件的。然而,对它们进行定义并将其单独引入并不是世界末日。。我只是不想把它们作为两个独立的组件分开,因为它们不是。它们应该放在一起,或者根本不放在一起。是的,Moose::Exporter会让你把它们放在一起。在我看来,在一个类中定义它们是一个坏主意,因为它将两个真正应该分开的不同事物合并在一起。我更新了答案,加入了一个使用推荐样式将两者结合在一起的示例。如果您想了解更多信息,我建议您访问irc.perl.org上的#moose,或者向moose邮件列表询问具体问题。@perigrin:事实证明,由于类属性和继承的限制,我不得不修改我的整个结构,所以现在我根本不使用“扩展”,而是将所有功能与角色结合起来。我不能使用apply_base_class_角色,因为我使用的是参数化角色;然而,简单地使用MySugar并不是不雅观的;使用'Role::blah'=>{params…}:)@如果你可能会和《驼鹿》上的人谈论允许准物质化角色作为特质发挥作用,我不确定有什么限制,但有人可能会有一个优雅的解决方案。
package MyApp;
use MySugar; 

has_rw 'name';
has 'size';
thing;

package main;
MyApp->new->something_special; # prints sparkles