Как нам динамически создавать недостающие атрибуты в Moo или Moose? - PullRequest
0 голосов
/ 04 июня 2018

У нас есть пример кода, как показано ниже.Можно ли захватить все недостающие атрибуты, вызванные в пакете FooBar, и создать его динамически?Это что-то вроде вызова PHP __ .

test.pl

package Person;
use feature qw(say);
use Moo;

has name => (is => "ro");

my $p = Person->new(name => "John");

say $p->name;

# The missing attribute method will be dynamically created when 
# invoked even it's not declared in Person.
say $p->lalala;

$ perl test.pl
John
Can't locate object method "lalala" via package "Test" at test.pl line 13.

1 Ответ

0 голосов
/ 04 июня 2018

Можно использовать 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 к вопросу: он показал, как добавить атрибут к экземпляру, а не ко всему классу.

...