--- nfo/perl/libs/DesignPattern/Bridge.pm 2003/02/11 10:34:19 1.7 +++ nfo/perl/libs/DesignPattern/Bridge.pm 2003/02/21 08:38:21 1.11 @@ -1,7 +1,20 @@ ## -------------------------------------------------------------------------------- -## $Id: Bridge.pm,v 1.7 2003/02/11 10:34:19 joko Exp $ +## $Id: Bridge.pm,v 1.11 2003/02/21 08:38:21 joko Exp $ ## -------------------------------------------------------------------------------- ## $Log: Bridge.pm,v $ +## Revision 1.11 2003/02/21 08:38:21 joko +## + additional checks +## + raising exceptions +## +## Revision 1.10 2003/02/20 20:50:32 joko +## + small exception handling: now inheriting from little Exception object +## +## Revision 1.9 2003/02/18 18:35:30 joko +## + encapsulated/abstracted some more functionality: sub load_single +## +## Revision 1.8 2003/02/14 14:20:05 joko +## + modified mixin behaviour +## ## Revision 1.7 2003/02/11 10:34:19 joko ## + loaded module may now lack 'mixin::with' declaration ## + this gets us the possibility to load modules from any perl namespace @@ -34,7 +47,11 @@ use strict; use warnings; -use base qw( DesignPattern::Object ); +use base qw( + DesignPattern::Object + DesignPattern::Exception +); + use Data::Dumper; @@ -126,6 +143,22 @@ sub load { my $self = shift; + my $modulename = shift; + my $options = shift; + + if (ref $modulename eq 'ARRAY') { + foreach (@$modulename) { + $self->load_single($_, $options); + } + } else { + $self->load_single($modulename, $options); + } + + } + + sub load_single { + + my $self = shift; my $modulename_load = shift; my $options = shift; @@ -143,6 +176,9 @@ # this is the module testing phase - use mixin doesn't seem to propagate errors by default eval("use $package;"); + $self->checkExceptions(); + +=pod if ($@) { $meta->{loaded}->{$package} = 0; # include caller information @@ -155,6 +191,7 @@ print $msg, "\n"; } } +=cut #print "ref-1: ", ref $self, "\n"; #print "ref-2: ", ref $self::SUPER, "\n"; @@ -163,19 +200,26 @@ #bless $self, $package; # V2: + $self->mixinPackage($package); + + if (my $method = $options->{method}) { + $self->$method(); + } + return 1; + + } + + sub mixinPackage { + my $self = shift; + my $package = shift; + # switch into foreign package and prepare for mixin $self->mixin_prepare($package); # switch into local package (scope which uses DesignPattern::Bridge) and mixin plugin-module $self->mixin_do($package); - if (my $method = $options->{method}) { - $self->$method(); - } - - return 1; - } # TODO: maybe refactor to DesignPattern::Object? what about the '$logger'? @@ -240,9 +284,21 @@ my $self = shift; my $includefile = shift; my $package = shift; - # TODO: do better error-detection here / prevent dies under all circumstances! - require $includefile; + + # pre-flight checks + if (!$includefile) { + $self->raiseException('Filename for inclusion was empty.'); + return; + } + + # go for it ... + eval("require '$includefile';"); + # ... and handle errors afterwards catching every message from perl itself ... + return if $self->checkExceptions(); + + # ... otherwise continue assuming everything is fine $self->mixinPackage($package) if $package; + } 1;