Quoteu UNIVERSAL::can, Suche nach Code in der Response-Klasse kommt demnächst ein elsif(exists $methodHash($name}){} hinzu,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
#!/usr/bin/perl package main; use strict; use warnings; use AutoLoader; use Data::Dumper; # Deklariere die Methoden # damit diese von AUTOLOAD gefunden werden sub foo; sub bar; # diese methoden liegen als source in einem hash # solch hash könnte z.B. mit DB_File als Datei angebunden sein my %mh = ( foo => q( my $self = shift; $self->{FOO} = 1; print "foo! @_\n"; ), bar => q( my $self = shift; $self->{BAR} = 1; print "bar!\n"; ), ); my $mo = main->new; # Instanz der main class # jetzt gucken wir mal, ob UNIVERSAL::can die Methode findet my $code = $mo->can('foo') or die "no method found"; $mo->$code(arg => 123); print Dumper $mo; # weitere Kontrolle, ob Attribut hinzugekommen ist # methods in class sub new{ my $class = shift; my $self = bless{}, $class; return $self; } # overload AUTOLOAD sub AUTOLOAD{ my $self = shift; my $sub = our $AUTOLOAD; $sub =~ s/.*:://; # extrahiere Klassen Name if(exists $mh{$sub}){ # aus der Source den Code erzeugen und ausführen my $code = eval "sub{$mh{$sub}}"; $self->$code(@_); } else{ return undef; } }
1 2 3 4 5 6 7
if(exists $mh{$sub}){ # aus der Source den Code erzeugen und ausführen if(ref($mh{$sub} ne 'CODE')){ $mh{$sub}=eval "sub{$mh{$sub}}"; } return $mh{$sub}->(@_); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
my $mo = main->new; my $code = $mo->can('foo') or die "Die Methode wurde nicht gefunden"; $mo->$code(); # execute print Dumper $mo; # INCR => 1 sub new{ return bless{INCR => 0}, shift } sub AUTOLOAD{ my $self = shift; my $subname = our $AUTOLOAD; $subname =~ s/.*:://; # extrahiere Klassen Name if(exists $mh{$subname}){ # compiliert wird hier my $code = eval "sub{$mh{$subname}}"; return $self->$code(@_); } }