Hi,
Kurz zum Modul:
ich hatte mir das schon sehr genau angeschaut, da ich mit Problem schon länger kämpfe. Es ist ja glücklicherweise pures Perl.
my $method = sub { return $_[0]->{variablenname} }
*{$class."::$field"} = $method
unless defined &{$class."::$field"};Nun wird über $class->$method $self->{variablenname} zurückgegeben.
Das hätte ich halt gern Variabler gehabt.
Soweit ich jetzt dahinter steige ist das Problem, diese Zeile:
Foo->mk_accessors($new, @$fields);
Hier muss statt 'Foo' eigentlich $new stehen, was aber nicht geht, da $new natürlich nicht diese funktion 'mk_accessors()' kennt.Das Problem sitzt noch tiefer ;)
Wenn du dein Vorhaben weiter verfolgen möchtest, gibt es nur folgende
Möglichkeit:Du speicherst alle *Instanzen/Objekt-Variablen*, die die Instanz
(z.B. $t2) kennt in einem Array/Hash und definierst eigene set/get
Methoden (s. Doku), die testen, ob auf das Feld zugegriffen werden
darf. Wenn nicht, ein croak() oder die() ggf. ein warn() wie immer du
wünschst.
wie hesagt ich möchte zur Laufzeit mit variablen Feldern arbeiten.
Das heißt ich weiss vorher nicht welche Felder existieren.
Natürlich könntest du dies auch über AUTOLOAD erreichen, aber das
ändert nichts am Sachverhalt (ist eben auch eine Methode und somit
in der Symboltabelle definiert, welche eben auf Packetebene
arbeitet). Oder du müsstest leider einfach alle benötigten Variablen
als Methoden exportieren, ob sie nun existieren oder nicht...
Das ist genauso wie ich es bisher mache und es funktioniert auch einwandfrei, aber AUTLOAD ist extrem langsam.
Oder aber, du musst für jeden Objekttyp eine eigene Klasse schreiben,
was ja normalerweise auch die richtige und bei vielen
Programmiersprachen die einzige Vorgehensweise ist.
Wahrscheinlich hast du recht. Ich fand es nur extrem lästig, dass ich für jedes (Daten)Objekt alles nochmal schreiben muss.
Es ist ja so, dass man ein Objekt einerseits nutzt um die Daten zu verwalten und anderseits brauche ich es meistens zum speichern in einer DB.
Also hatte ich mir überlegt (und wie gesagt auch mit AUTLOAD umgesetzt) ich schreib ein Objekt was einerseits alle Datenfelder als Methoden zu Verfügung stellt, das hat den Vorteil, dass ich nicht versuche auf Felder zuzugreifen, die nicht existieren und ich habe die Möglichkeit diese im Bedarfsfalle mit eigenen Methoden zu überschreiben. Zusätzlich habe ich jeweils eine Funktion eingebaut die mir die Daten als HASH zurückgibt und eine die die geänderten Felder zurückgibt, so dass ich z.b. beim schreiben in die Datenbank nur die geänderten Felder speichern kann.
Mein Ziel mit Class::Accessor war halt das langsame AUTLOAD zu vermeiden und ich hatte die wage Hoffnung, dass es irgendwie gehen muss die Methode, die Class::Accessor benutzt evtl. dafür zu benutzen aber bisher waren alle meine Versuche gescheitert, da ich dieses Foo in der Zeile "Foo->mk_accessors($new, @$fields);" nicht so hingebogen bekomme, dass es ein zur Laufzeit entstandenes Objekt beinhaltet.
Struppi.