Hi,
s.o., bei eval "" musst du genau aufpassen was du machst!
wahrscheinlich geht das sehr auf die Kosten der Wartbarkeit und der Fehlerbehebung.
Das wäre bei Perl6::Class genau dasselbe. Da ist einfach nur ein Filter vor den Interpreter geschaltet, der den Code umschreibt. Mit den Zeilenmeldungen hat man bei der Fehlersucher, sicher viel Spaß *grmpf*
Soweit ich weiß, ist bei eval {} auch der Vorteil, dass es gleich mitkompiliert werden kann, wohingegen eval "" erst zur Laufzeit interpretiert wird.
welche andere möglichkeit hast du noch zu vererben ?!
Ich kenn auch nur @ISA, aber brauche ich die Vererbung nicht dynamisch ändern. Lediglich die Klassen (die alle auf dieselbe Basisklasse zurückgeführt werden) sollen dynamisch erstellt werden.
my $packageName = 'neueKlasse';
eval << "PACK";
package $packageName;
use vars qw(@ISA);
@ISA = qw(deineUltraHochWichtigeBasisKlasse);sub new()
{
my $class = shift;
#Konstruktor der Basisklasse aufrufen, falls du das brauchst
bless ( ($class)->SUPER::new(), $class );
}
PACKmy $newObj = $packageName->new();
Genau, nur ich werde mir sogar die new-Funktion schenken. Auch die kommt von der Basisklasse. Lediglich eine Konstante wird in jeder Klasse extra definiert.
Inzwischen arbeite ich an einem anderen Lösungsweg. Hatte eigentlich damit gerechnet, dass das überhaupt nicht hinhaut, aber vielleicht taugt das etwas:
~~~perl
#!/usr/bin/perl
*test = *integ;
my $globRef = \*test;
$globRef::const = 'PARENT';
*test = *integ;
my $globRef2::const = 'ID';
print "integ:const ".$integ::const."\n";
print "globRef:const ".$globRef::const."\n";
print "globRef2:const ".$globRef2::const."\n";
$x = integ::new();
$y = *{$globRef}::new();
package integ;
sub new()
{
print "new instance of class".*__PACKAGE__{PACKAGE}__."\n";
return bless( {}, shift );
}
Naja, soweit schaut alles sehr vielversprechend aus. Die Constanten von $globRef und $globRef2 sind unterschiedlich, einzig der Aufruf der new Methode will mir über die globRefs nicht gelingen. Erst da bricht das Skript mit einer Fehlermeldung ab.
Ich muss gestehen, ich weiß da nicht wirklich ganz genau, was ich mache. Kannst Du vielleicht den letzten Schritt lösen.
Eine Funktion zu einer GlobRef muss man doch irgendwie aufrufen können, oder?
danke
Sven