sub new {
my $proto = shift;
my $p = shift || 'x_'; ## prefix nach Eingabe oder Default 'x_'
my %dummy; ## nicht wirklich nur dummy sondern DER DatenHash
## oder ??
Jaja, ich weiß jetzt auch nicht mehr warum ich das gestern eingebaut habe, egal.
no strict 'refs'; ## wegen typeglob
genau.
*{"${proto}::$p$func"} = sub { ## tricky. Subclassen
my $self = shift; ## was'n das für n'Rest?
## Klar, Objektreferenz hat keine Funktion mehr
Das ist eine anonyme Funktion oder ein closure.
my $self = bless %dummy, $proto;
return $self; ## meine Kosmetik
eigentlich reicht ja auch return bless ..., ich mußte heut Nacht ein paar Sachen ausprobieren, weil ich (und Class::Accessor) diese Technik anders anwenden. Im Konstruktor Funktionen erzeugen ist mir nicht geheuer.
Aber wenn ich es richtig interpretiere, wird eigentlich
aus einer Klasse Subklassen abgeleitet.
Der Trick mit dem Typeglob bewirkt Eintrage der
anonymen Subfunktionen in die Symboltable,
'magisch' existiert also in der Symboltable ein
&{Accessor::x_a} (als Sub ansrechbar)
${Accessor::x_a} (als Referenz ansprechbar)
Ich muss leider sagen, selbst als fortgeschrittener Laie tue ich mich schwer solche Dinge zu erklären. Ich habe lange gebraucht und viel rumprobiert, bis ich das so einsetzen konnte wie ich wollte, aber soweit ich das verstanden dürfte deine Beschreibung zutreffen.
So kann also die Methode (hier die anonyme Subfunktion) in einer Referenz gespeichert werden, ...
Nicht in einer Referenz, sondern in _der_. Der Nachteil dieser Methode ist, dass du bei jedem Objekt neue Funktionen in dem Package anlegst, d.h. in meinem Beispiel hat das y_ Objekt auch die Funktionen des x_ Objektes, da die Methoden im Namnensraum Accessor:: angelegt werden.
Ob und wie es geht, nur einem Objekt diese Funktion zu zuweisen, weiß ich nicht. In JS ist das einfach und ich denke auch dass es in Perl geht, nur wie?
Einer Typeglob Version bin ich gestern bei der Lekture hier begegnet:
http://www.perldesignpatterns.com/?AccessorPattern
im oberen Abschnitt: "Writing Accessors is Tedious "
JaJa, das ist die Technik, wie gesagt Class::Accessor benutzt diese (es gibt auch noch eine fast und faster Version davon).
Struppi.