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";

Вы уже получили реальный ответ, но реальный вопрос в том, почему у вас есть модуль, который экспортирует вещи и является объектом? Это довольно странный дизайн, и он может пахнуть кодом.

Другие вопросы по тегам