2017-04-18 6 views
3

Ich möchte einfache Methodenverkettung implementieren, für die Methoden Objekte zurückgeben müssen. Da mein Code Moose bereits verwendet und meine zukünftigen Klassen fast leer sind und nur ein Attribut mit einer Instanz einer anderen Klasse zurückgeben, habe ich mich entschieden, sie programmatisch mit Moose::Meta::Class zu generieren (das ist die Unterklasse von Class::MOP::Class). Zum ersten Mal mit Moosen Arbeits Metaclasses so schrieb ich einen einfachen Code, um zu versuchen:Rechte dynamische Klassengenerierung mit Moose :: Meta :: Class oder Class :: MOP :: Class

package Cat; 
use Moose; 


package Generator; 
use Moose; 

sub generate { 

    Class::MOP::Class->create(
     'Siberian' => (
      methods => { 
       echo => sub { print 'yeah!' } 
      } 
     ) 
    ); 

    Class::MOP::Class->create(
     'Tiger' => (
      attributes => [ 
       Class::MOP::Attribute->new('Siberian' => (
       default => sub { require Siberian; Siberian->new; } 
       )), 
      ], 
     ) 
    ); 

    Cat->meta->add_attribute(Class::MOP::Attribute->new(
     Tiger => (
      default => sub { require Tiger; Tiger->new } 
     ) 
    )); 

    print "Generation done!\n"; 

} 

generate(); 


package main; 
use Generator; 

my $a = Cat->new; 
warn $a->Tiger->Siberian->echo; # must print 'yeah!' but prints Can't locate object method "new" via package "Tiger" at dynamic.pl line 33 

Statt der erwarteten yeah! in Ausgabe Ich sehe

Kann nicht Objekt-Methode „neu“ über Paket „Tiger“ lokalisiert bei dynamic.pl Linie 33

Was ist falsch?

Antwort