Moose: Расширение Exporter приводит к исчезновению конструктора?
Вот что-то странное, что я не могу понять. У меня есть класс Moose, который я также хочу экспортировать в некоторые константы, используя старый стандартный модуль Exporter. Однако, как только я добавлю extends Exporter
в моем классе по какой-то причине конструктор Moose по умолчанию больше не наследуется, и я получаю фатальную ошибку:
Can't locate object method "new" via package "MyApp::Dispatch"
Вот простой тест, который демонстрирует проблему.
package Foo;
use Moose;
use constant NARF => 'poit';
extends 'Exporter';
1;
$ perl -I./lib -MFoo -e '$f=Foo->new'
Can't locate object method "new" via package "Foo" at -e line 1.
Удаление extends
линия делает проблему исчезнуть.
Это использует лося 0,93.
2 ответа
Предполагается, что вы наследуете от другого класса на основе Moose, поэтому он не наследуется от Moose::Object. Я не уверен, что будет стандартный ответ: просто вручную добавив Moose:: Object или каким-либо образом используя MooseX::NonMoose или что-то еще.
Но Exporter работает просто отлично, даже если не наследуется; просто импортируйте процедуру импорта:
use Exporter "import";
Вы уже получили реальный ответ, но реальный вопрос в том, почему у вас есть модуль, который экспортирует вещи и является объектом? Это довольно странный дизайн, и он может пахнуть кодом.