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

Veit Wahlich veit at ruhr.pm.org
Fr Jul 13 20:12:32 PDT 2007


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
-- 
Ruhr.pm
Perl Mongers im Ruhrgebiet
http://ruhr.pm.org/