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?
Großartig, Akzan, Ihr Code funktioniert! –