/[cvs]/nfo/perl/libs/DesignPattern/Bridge.pm
ViewVC logotype

Annotation of /nfo/perl/libs/DesignPattern/Bridge.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.6 - (hide annotations)
Sun Feb 9 16:22:51 2003 UTC (21 years, 3 months ago) by joko
Branch: MAIN
Changes since 1.5: +10 -1 lines
+ pseudo constructor mechanism via options

1 joko 1.1 ## --------------------------------------------------------------------------------
2 joko 1.6 ## $Id: Bridge.pm,v 1.5 2003/01/31 01:19:50 root Exp $
3 joko 1.1 ## --------------------------------------------------------------------------------
4 joko 1.2 ## $Log: Bridge.pm,v $
5 joko 1.6 ## Revision 1.5 2003/01/31 01:19:50 root
6     ## + fixed: doesn't need Log::Dispatch any more, but uses it if available
7     ##
8 root 1.5 ## Revision 1.4 2003/01/20 16:55:15 joko
9     ## + sub mixinPackage
10     ## + sub include
11     ##
12 joko 1.4 ## Revision 1.3 2002/12/16 19:57:12 joko
13     ## + sub unload
14     ##
15 joko 1.3 ## Revision 1.2 2002/12/15 02:06:15 joko
16     ## + feature to be able to specify module in non-perl-style when loading plugins: e.g. $process->load('Setup/Storage')
17     ##
18 joko 1.2 ## Revision 1.1 2002/12/13 21:46:29 joko
19     ## + initial check-in
20     ##
21 joko 1.1 ## --------------------------------------------------------------------------------
22    
23    
24     package DesignPattern::Bridge;
25    
26     use strict;
27     use warnings;
28    
29     use base qw( DesignPattern::Object );
30    
31 joko 1.2 use Data::Dumper;
32    
33 joko 1.1 ## ======== object inheritance ========
34    
35     # TODO:
36     # - this is no inheritance and it doesn't have to be
37     # - implement this module as a bridge to its sub-modules
38     # - use the BridgePattern (http://c2.com/cgi/wiki?BridgePattern)
39     # Using patterns was already successfully done with Data::Storage::Handler
40     # by implementing the AdapterPattern (http://c2.com/cgi/wiki?AdapterPattern)
41     # with Perl's AUTOLOAD-mechanism
42     # - try to use Perl's "tie" command to implement this functionality here instead of using AUTOLOAD!
43     # - sub getChildNodes
44     # - sub run
45    
46     # get logger instance
47 root 1.5 my $logger = eval { Log::Dispatch::Config->instance; };
48 joko 1.1
49 joko 1.3 my $meta;
50 joko 1.1
51     ## ======== object constructor ========
52     sub new {
53     my $invocant = shift;
54     my $class = ref($invocant) || $invocant;
55     my @args = ();
56     @_ && (@args = @_);
57 root 1.5 $logger->debug( __PACKAGE__ . "->new(@args)" ) if $logger;
58 joko 1.1 my $self = { @_ };
59     #print "class: $class", "\n";
60     bless $self, $class;
61     ##if (my $bizWorks = shift) {
62     ##$self->boot($bizWorks);
63     ##}
64    
65     return $self;
66     }
67    
68    
69     ## ======== method overrider ========
70     sub AUTOLOAD2 {
71    
72     my $self = shift;
73     our $AUTOLOAD;
74    
75     ##print "AUTOLOAD\n";
76    
77     my $method = $AUTOLOAD;
78     $method =~ s/^.*:://;
79    
80 root 1.5 $logger->debug( __PACKAGE__ . "->" . $method . "(@_)" . " (AUTOLOAD called, not dispatched)" ) if $logger;
81 joko 1.1
82     ## ->DESTROY would - if not declared - trigger an AUTOLOAD also
83     return if $method =~ m/::DESTROY$/;
84    
85     ## if ($self->_filter_AUTOLOAD($method)) {
86     ## $self->_accessStorage();
87     ## $self->{STORAGEHANDLE}->$method(@_);
88     ## }
89    
90     }
91 joko 1.3
92     sub _getPluginPackage {
93     my $self = shift;
94     my $modulename_load = shift;
95    
96     # substitute slashes through double double-colons to load modules perl-style
97     $modulename_load =~ s/\//::/g;
98    
99     # build full package name
100     my $self_classname = ref $self;
101     my $package = $self_classname . '::' . $modulename_load;
102     return $package;
103     }
104 joko 1.1
105     sub load {
106    
107     my $self = shift;
108 joko 1.3 my $modulename_load = shift;
109 joko 1.1
110 joko 1.6 my $options = shift;
111    
112 joko 1.4 my $self_modulename = ref $self;
113 joko 1.3 my $package = $self->_getPluginPackage($modulename_load);
114 joko 1.1
115 joko 1.3 if ($meta->{loaded}->{$package}) {
116     return 1;
117     }
118 joko 1.2
119 root 1.5 #$logger->info( __PACKAGE__ . "->load: $package" ) if $logger;
120     #$logger->info( __PACKAGE__ . "->load: $self_modulename" ) if $logger;
121     $logger->debug( $self_modulename . "->load: $package\t[via " . __PACKAGE__ . "]" ) if $logger;
122 joko 1.1
123     # this is the module testing phase - use mixin doesn't seem to propagate errors by default
124     eval("use $package;");
125     if ($@) {
126 joko 1.3 $meta->{loaded}->{$package} = 0;
127 joko 1.2 # include caller information
128     my @caller = caller;
129     my $caller_msg = $caller[1] . ':' . $caller[2];
130 root 1.5 my $msg = __PACKAGE__ . "->load: $@ ($caller_msg)";
131     if ($logger) {
132     $logger->error($msg);
133     } else {
134     print $msg, "\n";
135     }
136 joko 1.1 }
137    
138     #print "ref-1: ", ref $self, "\n";
139     #print "ref-2: ", ref $self::SUPER, "\n";
140    
141     # V1:
142     #bless $self, $package;
143    
144     # V2:
145     # switch into foreign package and mixin plugin-module
146 joko 1.4 $self->mixinPackage($package);
147 joko 1.6
148     if (my $method = $options->{method}) {
149     $self->$method();
150     }
151 joko 1.4
152     return 1;
153    
154     }
155    
156     # TODO: maybe refactor to DesignPattern::Object? what about the '$logger'?
157     sub mixinPackage {
158     my $self = shift;
159     my $package = shift;
160     # switch into foreign package and mixin plugin-module
161 joko 1.3 my $self_classname = ref $self;
162 joko 1.1 eval("package $self_classname; use mixin '$package';");
163     #eval("use mixin_all '$package';");
164     if ($@) {
165 joko 1.3 $meta->{loaded}->{$package} = 0;
166 root 1.5 $logger->error( __PACKAGE__ . "->load: $@" ) if $logger;
167 joko 1.3 } else {
168     $meta->{loaded}->{$package} = 1;
169 joko 1.1 }
170 joko 1.3 }
171    
172     sub unload {
173    
174     my $self = shift;
175     my $modulename_unload = shift;
176    
177     my $package = $self->_getPluginPackage($modulename_unload);
178 joko 1.1
179 joko 1.3 if ($meta->{loaded}->{$package}) {
180     $meta->{loaded}->{$package} = 0;
181     my $where = __PACKAGE__ . ':' . __LINE__;
182 root 1.5 $logger->debug( __PACKAGE__ . "->unload: FIXME: DESTROY object is not implemented at '$where'." ) if $logger;
183 joko 1.3 }
184    
185 joko 1.1 }
186 joko 1.3
187 joko 1.1
188     sub boot {
189     my $self = shift;
190     $self->_abstract_function('boot');
191 joko 1.4 }
192    
193     sub include {
194     my $self = shift;
195     my $includefile = shift;
196     my $package = shift;
197     # TODO: do better error-detection here / prevent dies under all circumstances!
198     require $includefile;
199     $self->mixinPackage($package) if $package;
200 joko 1.1 }
201    
202     1;

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed