Moose: Расширение Exporter приводит к исчезновению конструктора? - PullRequest
1 голос
/ 27 ноября 2009

Вот что-то странное, что я не могу понять. У меня есть класс 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 ]

4 голосов
/ 27 ноября 2009

Предполагается, что вы наследуете от другого класса, основанного на Moose, поэтому он не наследуется от Moose :: Object. Я не уверен, каким будет стандартный ответ: просто вручную добавить Moose :: Object или каким-либо образом с помощью MooseX :: NonMoose или что-то еще.

Но Exporter работает просто отлично, даже если не наследуется; просто импортируйте процедуру импорта:

use Exporter "import";
2 голосов
/ 27 ноября 2009

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

...