So nach einer peinlichen Zeit Debugging, habe ich endlich this issue zu einem einfachen Testfall ausgezogen. Ich würde demütig um Hilfe bitten, zu verstehen, warum es scheitert. :) Hier ist die Fehlermeldung erhalte ich:MooseX :: Typen Deklarationsproblem, enger Testfall :)
plxc16479> $h2/tmp/tmp18.pl
This method [new] requires a single argument. at /nfs/pdx/disks/nehalem.pde.077/perl/5.12.2/lib64/site_perl/MooseX/Types/TypeDecorator.pm line 91
MooseX::Types::TypeDecorator::new('MooseX::Types::TypeDecorator=HASH(0x655b90)') called at /nfs/pdx/disks/nehalem.pde.077/projects/lib/Program-Plist-Pl/lib/Program/Plist/Pl.pm line 10
Program::Plist::Pl::BUILD('Program::Plist::Pl=HASH(0x63d478)', 'HASH(0x63d220)') called at generated method (unknown origin) line 29
Program::Plist::Pl::new('Program::Plist::Pl') called at /nfs/pdx/disks/nehalem.pde.077/tmp/tmp18.pl line 10
Wrapper Testskript:
use strict;
use warnings;
BEGIN {push(@INC, split(':', $ENV{PERL_TEST_LIBS}))};
use Program::Plist::Pl;
my $obj = Program::Plist::Pl->new();
Programm :: Plist :: Pl Datei:
package Program::Plist::Pl;
use Moose;
use namespace::autoclean;
use Program::Types qw(Pattern); # <-- Removing this fixes error
use Program::Plist::Pl::Pattern;
sub BUILD {
my $pattern_obj = Program::Plist::Pl::Pattern->new();
}
__PACKAGE__->meta->make_immutable;
1;
Programm :: Typen Datei:
package Program::Types;
use MooseX::Types -declare => [qw(Pattern)];
class_type Pattern, {class => 'Program::Plist::Pl::Pattern'};
1;
Und das Programm :: Plist :: Pl :: Patte rn-Datei:
package Program::Plist::Pl::Pattern;
use Moose;
use namespace::autoclean;
__PACKAGE__->meta->make_immutable;
1;
Hinweise: Während ich von Program::Types
in dem obigen Code den Pattern
Typen nicht brauchen, ich in anderem Code zu tun, die gezupft wird. Die PERL_TEST_LIBS
env var, von der ich INC
Pfade abruf, enthält nur Pfade zu den Projektmodulen. Aus diesen Pfaden werden keine anderen Module geladen. Die MooseX::Types Definition für Pattern
verursacht Probleme, aber ich bin nicht sicher, warum. Die Dokumentation zeigt die Syntax, die ich verwende, aber es ist möglich, dass ich class_type
missbrauche, da nicht viel darüber gesagt wird. Absicht ist, Pattern
für Typprüfung über MooseX::Params::Validate verwenden zu können, um zu überprüfen, ob das Argument ein Program::Plist::Pl::Program
Objekt ist. direkt von Pattern->new
aus den tmp18.pl
Wrapper führt zu keinem Fehler aufrufen, auch wenn der Program::Types
Pattern
Typ importiert
ich gefunden habe, dass die dazwischen liegenden Klasse Program::Plist::Pl
aus der Gleichung zu entfernen.
Es scheint, dass Program :: Plist :: Pl :: Pattern-> new mit Pattern-> new verwechselt wird, wobei Pattern mein MooseX-definierter Typ ist.Anstatt eine Instanz von Program :: Plist :: Pl :: Pattern zu erstellen, wird versucht, eine Instanz des Objekts Mustertyp zu erstellen. –