Thread Funktionen aus Modul parsen (6 answers)
Opened by rosti at 2012-03-01 18:46

rosti
 2012-03-02 14:27
#156582 #156582
User since
2011-03-19
3492 Artikel
BenutzerIn
[Homepage]
user image
Quote
u UNIVERSAL::can, Suche nach Code in der Response-Klasse kommt demnächst ein elsif(exists $methodHash($name}){} hinzu,


Das kann entfallen, wenn die Subs im Hash als Stub deklariert werden. Es wird AutoLoad eingebunden und eine eigene Methode AUTOLOAD geschrieben. Damit erkennt UNIVERSAL::can auch diese Methoden, die nur bei Bedarf compiliert werden. Für Interessenten ein bischen Code:

Code (perl): (dl )
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;
        }
}


Im Prinzip ist das eine Alternative zum Verzeichnis lib/auto/
Also keine *.al-Dateien mit einzelnen Methoden, sondern diese Methoden in einem Hash. Schön kompakt ;)

Viele Grüße,
Rosti

View full thread Funktionen aus Modul parsen