[Ruhr-pm] Problem: ueberwachter Hashzugriff auf Objektattribute ohne Akzessoren [scanned]

Ingo Wichmann iw at taikonet.de
Fr Jul 13 22:40:15 PDT 2007


Die Sauereien Tie und Symbol hast Du ja schon genannt. Aber mit "use
overload" kann man auch ganz prima verwirrende Programme schreiben. In
Deinem Fall könntest Du '%{}' überladen. Weiß nicht, ob sich das auch auf
$foo->{bar} auswirkt.

Viele Grüße,

Ingo

Veit Wahlich schrieb:
> Guten Morgen!
> 
> Ich habe das folgende Problem zu dem mir aktuell keine annaehernd
> saubere Loesung einfaellt und fuer das ich ueber alle Anregungen
> gluecklich waere:
> 
> Ich moechte regulaer ein Objekt erzeugen, in dem ich Daten speichern und
> Lesen moechte, ohne spezielle Akzessoren (set-/get-Methoden) zu
> verwenden. Beispiel:
> 
> package main;
> my $baz = new Foo::Bar(%args);
> $baz->{bla} = 'blubb';
> print $baz->{bla}."\n";
> 
> Soweit ja absolut ueblich. Das Problem sind aber folgende Bedingungen:
> 
> 1. Ich speichere in dem Hash des Objekts diverse Attribute des Objekts,
> sodass bestimmte Schluessel bereits verwendet werden.
> Als Schluessel sollen aber grundsaetzlich beliebige Werte moeglich sein,
> daher wuerde ich intern im Objekt die Daten statt direkt in $self={};
> gern in $self->{data}={}; speichern.
> 
> 2. Ich muss sofort mitkriegen, sobald ein Wert geaendert wird, was ja
> mit einem set-Akzessor kein Problem waere, hier muesste es aber aehnlich
> der STORE-Methode einer tied hash-Klasse funktionieren.
> 
> Meine Fragen daher:
> Hat jemand eine Idee, wie sich ein solcher Zugriff realisieren laesst?
> Lassen sich ohne tie generische Hash-Zugriffsmethoden fuer ein Objekt
> definieren oder tie in irgendeiner Weise umbiegen, sodass o.G.
> funktioniert?
> 
> Ich bin aufgrund der offensichtlichen Verwandtschaft mit tie bereits
> entgegen der ueblichen Verwendungsszenarien einen Stosz voll
> Moeglichkeiten durchgegangen, $self direkt im Konstruktor (new) mit tie
> zu binden -- an die eigene Klasse, an eine andere Klasse etc -- leider
> ohne nennenswerten Erfolg bisher.
> 
> Eine klassische Verwendung a la
> tie my %baz,'Foo::Bar',%args;
> funktioniert zwar, ist aber nicht gewuenscht, eher das klassische
> OO-Vorgehen, u.U. wie es z.B. fuer Filehandles auch bei IO::Handle ueber
> das generische Symbol aus Symbol.pm auf den untersten Ebenen
> funktioniert.
> 
> Viele Dank fuer jede Hilfe,
> // Veit