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

Dynamically generate writer/reader from attribute names in Moose

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

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

我的问题是,有没有办法为元素数组动态执行此操作?可以这样做:

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

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

bad accessor/reader/writer/predicate/clearer format, must be a HASH ref

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

我希望得到的是(这不起作用):

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

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

has 不是魔法。这只是一个子程序调用。所以像这样的东西应该可以工作(未经测试):

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