gpt4 book ai didi

perl - 有什么方法可以在 Moose 对象中使用 Moose::Exporter 吗?

转载 作者:行者123 更新时间:2023-12-01 10:14:58 24 4
gpt4 key购买 nike

我正在寻找一种在父级中设置一些辅助方法的方法 Moose类,而不是独立的实用程序类。如果可能的话,这将是一种将 Moose 糖添加到模块的更透明的方式,因为它不需要明确要求任何辅助模块(因为一切都将通过 extends 声明来实现)。

基于example provided in the documentation ,这大致就是我想要的:

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'
String found where operator expected at Child.pm line 10, near "has_rw 'size'"        (Do you need to predeclare has_rw?)syntax error at Child.pm line 10, near "has_rw 'size'"Bareword "thing" not allowed while "strict subs" in use at Child.pm line 12.Compilation failed in require.BEGIN failed--compilation aborted.

附言。我也试过将导出魔法转移到一个角色中(with Role; 而不是 extends Parent;),但同样的错误发生了。

最佳答案

这不受支持,这是有充分理由的。一个类或一个角色与糖方法不同,在某种程度上不同的东西应该是不同的。如果您的问题是必须“使用”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 以及其他几个包的工作方式。我个人反对像你在这里建议的那样让 extends 引入糖,因为 Class 不是糖函数的捆绑,这两者真的不应该混淆。

更新:要同时引入两者,最简洁的方法是将 Parent 重新设计为应用于 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

我相信这是您想要的最终细节。

关于perl - 有什么方法可以在 Moose 对象中使用 Moose::Exporter 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1830154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com