So würde nur die Möglichkeit bleiben mit eval in der Konstruktorphase diese Methoden zu erzeugen. Das hat aber, so meine ich, eine empfindliche Performance Einbusse.
Naja, das scheint mir für das Namensraumproblem nicht angemessen.Sowas läßt sich mit der Technik, die z.b. in
Class::Accessor verwendet wird umsetzen.
Hallo Struppi
Ich habe deinen Code mal ausprobiert, und der funktioniert so auch.
Aber ich habe trotzdem Probleme, ihn ganz zu verstehen.
#!/usr/bin/perl -w
use strict;
use constant NL => "\n";
package Accessor;
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 ??
no strict 'refs'; ## wegen typeglob
foreach my $func (qw(a b c)) { ## in Schleife mehrere S/Getter setzen
*{"${proto}::$p$func"} = sub { ## tricky. Subclassen
my $self = shift; ## was'n das für n'Rest?
## Klar, Objektreferenz hat keine Funktion mehr
$dummy{$func} = $_[0] if @_; ## OK
return $dummy{$func};
};
}
my $self = bless \%dummy, $proto;
return $self; ## meine Kosmetik
}
Ich durchschaue es noch nicht ganz.
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)
So kann also die Methode (hier die anonyme Subfunktion) in einer Referenz gespeichert werden, und denoch ist sie über den normalen Methoden zugriff mit dem -> Operator ansprechbar.
Einer Typeglob Version bin ich gestern bei der Lekture hier begegnet:
http://www.perldesignpatterns.com/?AccessorPattern
im oberen Abschnitt: "Writing Accessors is Tedious "
Das sieht insgesamt sehr elegant aus, vor allem, weil man von den Subclassen von aussen eigentlich nichts sieht.
my $y = new Accessor('y_');
$y->y_a('y accessor');
print $y->y_a(), "\n";
mfg Beat
Selber klauen ist schöner!