2023-07-25T08:48:59
GwenDragonQuoteBei all diesen OO-Modulen sind Attribute einfach Keys im Objekt-Hash, da kannst Du jederzeit welche reinschreiben.
Moment, das heißt im gemousten Modul ist
ist gleiches wie
?
Beinuhe! 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.
Es ist auch nicht ganz genau das gleiche. Die Methode
->Name existiert deswegen, weil ich das Attribut
Name mit is => 'ro' deklariert habe.
2023-07-25T08:48:59
GwenDragon
In meinem Beispiel schon nicht mehr: Der Versuch
$c->text->Name('Mehrwert') wird abgelehnt:
Cannot assign a value to a read-only accessor of Name
Man sehe: Ich habe das Attribut als
'ro' (readonly) deklariert und nicht als
'rw' (read/write).
Irgendwie blöd, dass
$c->text->{Name} = 'Mehrwert'; trotzdem funktioniert.
2023-07-25T08:48:59
GwenDragonich dachte, Attribute sind irgendwie tricky versteckt, damit niemand direkt dran rum murksen kann.
Nicht 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.
Das ist ja der Grund, warum andere Objektsysteme entstanden sind: Da gibt's zum einen die ganze Latte von "Inside-Out"-Objektmodulen (von
Class::Std bis
Dios), bei denen die Attribute tatsächlich tricky versteckt sind. So tricky, dass der
Data::Dumper, der Debugger und Serialisierer wie
Storable erstmal nicht funktionieren - und deswegen haben die sich auch längst nicht so durchgesetzt wie M*.
Und dann gibt's eben mit
Object::Pad und ab Perl 5.38
feature 'class' die Systeme, bei denen
class und
method als neue Schlüsselwörter eingeführt wurden. Da sind die Attribute auch nicht mehr direkt zugänglich.
2023-07-25T08:48:59
GwenDragonÜ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.
Dafür gibt's etliches auf CPAN, zum Beispiel
Module::Loader, das in seinem "SEE ALSO"-Kapitel auch einige Alternativen nennt.