2016-02-01 2 views
2

Документация Moose указывает, что свойство атрибута в классе definiton должно быть строкой, содержащей имя для функции, которая будет вызываться для создания соответствующего атрибута. Однако простое тестирование показывает, что подзадача также работает:Использование вспомогательной ссылки с Moose builder

has 'some_attribute' => (
    is => 'ro', 
    lazy => 1, 
    builder => sub { 
     require SomeModule::Heavy; 
     return SomeModule::Heavy->new($_[0]); 
    }, 
); 

Я что-то пропустил в документах? Является ли использование ссылочной ссылки официально поддерживаемой для builder?

+1

Раздел в документах, указывающий, что строители вызываются по имени, находится в https://metacpan.org/pod/distribution/Moose/lib/Moose/Manual/Attributes.pod#Builders-allow-subclassing –

ответ

1

Moose manual говорит:

Вы также можете предоставить ссылку на подпрограмму для default. Эта ссылка будет называться как метод объекта. [...] В качестве альтернативы использованию ссылки подпрограммы вы можете предоставить метод builder для вашего атрибута. Это имеет ряд преимуществ. Во-первых, он перемещает кусок кода в свой собственный именованный метод, что улучшает читаемость и организацию кода. Во-вторых, поскольку это именованный метод, он может быть подклассифицирован или предоставлен ролью.

Итак, если вы используете ссылку подпрограммы для builder, вы теряете эти преимущества. Я считаю, что ссылка подпрограммы работает как побочный эффект и не имеет практического применения.

+0

Да, это похоже, это, хотя я бы утвердил, является ли использование пространства имен пакетов с произвольными псевдо-частными именованными функциями «преимуществом». Подкласс/роль по-прежнему нужно проверять на вашем классе, потому что он не может надежно угадать, как вы называете своих сборщиков, и это может легко заменить «default». –

Смежные вопросы