从Moose中的属性名称动态生成writer / reader

时间:2017-07-25 13:05:56

标签: perl moose

在Moose中,我们可以对实例属性进行限制或添加getter / setter,如下所示:

has 'color' => (
  is  => 'rw',
  isa => 'Str',
  writer => '_set_color',
);

我的问题是,有没有办法动态地为元素数组做这个?可以做这样的事情:

has ['color', 'temperature', 'size'] => (
  is  => 'rw',
  isa => 'Str',
);

但是有没有办法为每个项目创建自己的作者(或读者),例如_set_color_set_temperature_set_size?我试着看看以下是否产生了任何见解,但它返回了一个错误

  

糟糕的访问者/读者/作者/谓词/更清晰的格式,必须是HASH   参考

has ['color', 'temperature', 'size'] => (
  is  => 'rw',
  isa => 'Str',
  writer => sub {
    print Dumper(\@_);
    return;
);

我希望获得的是(它不起作用):

has ['color', 'temperature', 'size'] => (
  is  => 'rw',
  isa => 'Str',
  writer => "_set_$_";
);

我需要自定义编写器,所以只选择Moose提供的编写器对我不起作用。

1 个答案:

答案 0 :(得分:4)

has不是魔法。它只是一个子程序调用。所以这样的事情应该有效(未经测试):

for (qw[colour temperature size]) {
  has $_ => (
    is     => 'rw',
    isa    => 'Str',
    writer => "_set_$_",
  );
}