Thread [Mouse] Attribute zur Laufzeit generieren und vererben
(5 answers)
Opened by GwenDragon at 2023-07-24 17:10
Zunächst mal: Mit Mouse (genau wie bei den anderen M-Viechern) werden die Attribute immer zur Laufzeit generiert. has ist ein sub das in Dein package importiert wird. Bei all diesen OO-Modulen sind Attribute einfach Keys im Objekt-Hash, da kannst Du jederzeit welche reinschreiben. Was Mouse und andere liefern, ist "nur" syntaktische Kürze, weil Parameter-Validierung und Accessor-Methoden nicht hingeschrieben werden müssen, sondern als isa beziehungsweise is deklariert werden.
Wenn Du selbst zur Laufzeit beliebige Attribut-Namen nicht nur ins Objekt reinschreiben willst, sondern auch für diese Namen Accessor-Funktionen und Typ-Prüfung haben willst, dann musst Du in Mouse::Meta::Class einsteigen. Allerdings ist das Meta-Protokoll genau das, was Moose "langsam" macht (was übrigens in den meisten Fällen nicht wirklich stört). Moose hat den Vorteil, dass es recht umfangreiche Dokumentation mit Beispielen gibt, von denen sich viele 1:1 auf Mouse übertragen lassen. Ich verstehe allerdings Dein Problem nicht so recht. Sind es beliebige Namen, die als Name = Wert aus der Konfigurationsdatei gelesen werden? Muss die übergeordnete Klasse für diese Namen mehr tun als sie nur abspeichern und bei Bedarf wieder rausrücken? So, wie das bisher dasteht, würde ich für die Name = Wert-Paare ein Hashref oder ein MyModule::Config::Text-Object als Attribut verwenden. Das ist dann keine Vererbung, sondern eine "hat-eine"-Beziehung: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 use 5.026; package MyModule::Config { use Mouse; has text => (is => 'ro', isa => 'MyModule::Config::Text'); } package MyModule::Config::Text { use Mouse; has Name => (is => 'ro'); } my $c = MyModule::Config->new( text => MyModule::Config::Text->new(Name => 'Wert') ); say $c->text->Name; # 'Wert' |