Можно использовать AUTOLOAD и метапрограммирование, остается вопрос Почему .
Могут быть более приятные способы использования параметризованных ролей, но я просто хотел быстро показать, каксделать это.Я бы отклонил такой код в обзоре (я бы ожидал, по крайней мере, комментарий, объясняющий, почему необходима автозагрузка).
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
{ package MyObj;
use Moose;
sub AUTOLOAD {
my ($self) = @_;
( my $method = our $AUTOLOAD ) =~ s/.*:://;
(ref $self)->meta->add_attribute($method, is => 'rw');
goto &$method
}
}
say 'MyObj'->can('lalala'); # No, it can't.
my $o = 'MyObj'->new;
$o->lalala(12); # Attribute created.
say $o->lalala; # 12.
Обновление: Ранее мой код был более сложным, так какон ответил на комментарий @ simbabque к вопросу: он показал, как добавить атрибут к экземпляру, а не ко всему классу.