2009-11-27 4 views
1

Voici quelque chose d'étrange que je ne peux pas comprendre. J'ai une classe Moose que je veux aussi exporter certaines constantes, en utilisant l'ancien module Exporter standard. Cependant, dès que j'ajoute extends Exporter à ma classe, pour une raison quelconque, la valeur par défaut constructeur Moose ne reçoit plus hérité et je reçois l'erreur fatale:Moose: l'exportateur extensible provoque la disparition du constructeur?

Can't locate object method "new" via package "MyApp::Dispatch" 

Voici un test simple qui illustre le problème.

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. 

Retrait de la ligne extends fait le problème disparaît.

Ceci utilise Moose 0.93.

Répondre

4

Il est supposé que vous héritez d'une autre classe Moose, donc il n'hérite pas de Moose :: Object. Je ne suis pas sûr de ce que la réponse standard serait: juste en ajoutant manuellement Moose :: Object ou en quelque sorte en utilisant MooseX :: NonMoose ou autre chose.

Mais Exporter fonctionne très bien même s'il n'est pas hérité; il suffit d'importer sa routine d'importation:

use Exporter "import"; 
+2

Eh bien, cela aurait dû être évident, n'est-ce pas? Je me sens bête ce soir. :) J'ai déjà utilisé MooseX :: NonMoose auparavant, donc j'aurais dû y penser, mais je ne l'ai pas fait. Quoi qu'il en soit, importer 'import' plutôt qu'hériter fonctionne bien. – friedo

+0

Le paramètre 'extends' de Moose est équivalent à' @ISA = @ list'. Si cette liste est vide au moment de la compilation Moose met automatiquement 'Moose :: Object' dans @ISA pour vous. – perigrin

+0

@perigrin: c'était essentiellement ce que j'ai dit. – ysth

2

Vous avez déjà eu la vraie réponse, mais la vraie question est pourquoi avez-vous un module qui exporte des choses et est un objet? C'est un design assez bizarre, et peut être une odeur de code.

+1

Les exportations sont des constantes qui sont utilisées par les rappels enregistrés par d'autres parties du système; Je suis d'accord c'est un peu bizarre et finira probablement par repenser le design tôt ou tard. Mais ça marche pour le moment. – friedo

Questions connexes