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'
QuoteBei all diesen OO-Modulen sind Attribute einfach Keys im Objekt-Hash, da kannst Du jederzeit welche reinschreiben.
$self->{FOO}
$self->FOO()
$self->{FOO} = 42;
$self->FOO(42);
2023-07-25T08:48:59 GwenDragonBeinuhe! Probier's einfach mit meinem kurzen Beispiel aus, indem Du in der letzten Zeile anstelle von $c->text->Name schreibst: $c->text->{Name}. Funktioniert genauso. Ist aber unsauber und funktioniert nur, solange der Autor der Klasse bei Mouse bleibt und nicht etwa eines der nicht-Hash-Objektframeworks (deren gibt's auch etliche) verwendet.
2023-07-25T08:48:59 GwenDragonIn meinem Beispiel schon nicht mehr: Der Versuch $c->text->Name('Mehrwert') wird abgelehnt:
Cannot assign a value to a read-only accessor of Name
2023-07-25T08:48:59 GwenDragonNicht bei den M*-Objekthelfern! Es geht bei denen überwiegend um Komfortgewinn für "anständige" Programmierer: Die Accessor-Methoden werden automatisch generiert, und beim Konstruktor wird der Typ von Parametern automagisch überprüft. OO-Features wie Vererbung, Rollen und Delegation bekommt man auch komfortabel, aber eben ... mit Kollisionsgefahr bei den Hash-Keys.ich dachte, Attribute sind irgendwie tricky versteckt, damit niemand direkt dran rum murksen kann.
2023-07-25T08:48:59 GwenDragonDafür gibt's etliches auf CPAN, zum Beispiel Module::Loader, das in seinem "SEE ALSO"-Kapitel auch einige Alternativen nennt.Übrigens, das hier war schon früher eine Idee von mir:
has text => (is => 'ro', isa => 'MyModule::Config::Text');
Muss ich mal sehen wie ich das mache, dass je nach Existenz der Konfigdateien im Dateisystem das richtige Config-Modul geladen wird.