Thread Subroutine calls über mehrere packages / module (7 answers)
Opened by Haspasus at 2009-11-17 22:15

topeg
 2009-11-18 00:29
#128266 #128266
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ich habe es mal überarbeitet.

So würde ich es machen, da man damit sehr flexible ist.
main.pl
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl
use strict:
use warnings;
use Test::Case::Modul1;
use Test::Case::Modul2;

my $modul1 = new Test::Case::Modul1;
my $modul2 = new Test::Case::Modul2;

$modul1->setzeFehlerbehandlung( sub{ $modul2->fehlerbehandlung(@_); });
$modul1->printMessage("testfehler");


Modul1.pm
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
package Test::Case::Modul1;
use strict;
use warnings;

sub new {
    my $class = shift;
    my $self  = {};
    my $self->{FehlerHandler} = sub{warn("$_[0]\n"); 1};
    bless($self,$class);
    return $self;
}

sub setzeFehlerbehandlung {
    my $self    = shift;
    my $handler = shift;
    if(ref($handler) eq 'CODE'){
      $self->{FehlerHandler}=$handler;
      return 1;
    }
    return 0;
}

sub printMessage {
    my $self = shift;
    my $msg  = shift || ''; 
    return $self->{FehlerHandler}->($msg);
}

1;


Modul2.pm
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
package Test::Case::Modul2;
use strict;
use warnings;

sub new {
    my $class = shift;
    my $self  = {};
    bless($self,$class);
    return $self;
}

sub fehlerbehandlung {
    my $self = shift;
    my $msg  = shift;

    print "O" x 30;
    print "\n";
    print "Error handling in Modul2\n";
    print "Caller was: ".caller(0)."\n";
    print "Message: ".$msg."\n";
    print "O" x 30;
    print "\n";

    return 1;
}

1;


####################################################################
oder etwas anders:
Das wäre ähnlich dem was Java als "Interface" kennt

main.pl
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl
use strict:
use warnings;
use Test::Case::Modul1;
use Test::Case::Modul2;

my $modul1 = new Test::Case::Modul1;
my $modul2 = new Test::Case::Modul2;

$modul1->setzeFehlerbehandlung( $modul2 );
$modul1->printMessage("testfehler");


Modul1.pm
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
package Test::Case::Modul1;
use strict;
use warnings;

sub new {
    my $class = shift;
    my $self  = {};
    my $self->{FehlerHandler} = $self;
    bless($self,$class);
    return $self;
}

sub setzeFehlerbehandlung {
    my $self    = shift;
    my $handler = shift;
    if($handler->can('fehlerbehandlung')){
      $self->{FehlerHandler}=$handler;
      return 1;
    }
    return 0;
}

sub printMessage {
    my $self = shift;
    my $msg  = shift || '';
    return $self->{FehlerHandler}->fehlerbehandlung($msg);
}

sub fehlerbehandlung {
    my $self = shift;
    my $msg  = shift;
    warn("$msg");
    return 1;
}


1;


Modul2.pm
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
package Test::Case::Modul2;
use strict;
use warnings;

sub new {
    my $class = shift;
    my $self  = {};
    bless($self,$class);
    return $self;
}

sub fehlerbehandlung {
    my $self = shift;
    my $msg  = shift;

    print "O" x 30;
    print "\n";
    print "Error handling in Modul2\n";
    print "Caller was: ".caller(0)."\n";
    print "Message: ".$msg."\n";
    print "O" x 30;
    print "\n";

    return 1;
}

1;


Beides ungetestet.

View full thread Subroutine calls über mehrere packages / module