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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.6 - (show 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 ## --------------------------------------------------------------------------------
2 ## $Id: Bridge.pm,v 1.5 2003/01/31 01:19:50 root Exp $
3 ## --------------------------------------------------------------------------------
4 ## $Log: Bridge.pm,v $
5 ## 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 ## Revision 1.4 2003/01/20 16:55:15 joko
9 ## + sub mixinPackage
10 ## + sub include
11 ##
12 ## Revision 1.3 2002/12/16 19:57:12 joko
13 ## + sub unload
14 ##
15 ## 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 ## Revision 1.1 2002/12/13 21:46:29 joko
19 ## + initial check-in
20 ##
21 ## --------------------------------------------------------------------------------
22
23
24 package DesignPattern::Bridge;
25
26 use strict;
27 use warnings;
28
29 use base qw( DesignPattern::Object );
30
31 use Data::Dumper;
32
33 ## ======== 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 my $logger = eval { Log::Dispatch::Config->instance; };
48
49 my $meta;
50
51 ## ======== object constructor ========
52 sub new {
53 my $invocant = shift;
54 my $class = ref($invocant) || $invocant;
55 my @args = ();
56 @_ && (@args = @_);
57 $logger->debug( __PACKAGE__ . "->new(@args)" ) if $logger;
58 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 $logger->debug( __PACKAGE__ . "->" . $method . "(@_)" . " (AUTOLOAD called, not dispatched)" ) if $logger;
81
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
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
105 sub load {
106
107 my $self = shift;
108 my $modulename_load = shift;
109
110 my $options = shift;
111
112 my $self_modulename = ref $self;
113 my $package = $self->_getPluginPackage($modulename_load);
114
115 if ($meta->{loaded}->{$package}) {
116 return 1;
117 }
118
119 #$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
123 # this is the module testing phase - use mixin doesn't seem to propagate errors by default
124 eval("use $package;");
125 if ($@) {
126 $meta->{loaded}->{$package} = 0;
127 # include caller information
128 my @caller = caller;
129 my $caller_msg = $caller[1] . ':' . $caller[2];
130 my $msg = __PACKAGE__ . "->load: $@ ($caller_msg)";
131 if ($logger) {
132 $logger->error($msg);
133 } else {
134 print $msg, "\n";
135 }
136 }
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 $self->mixinPackage($package);
147
148 if (my $method = $options->{method}) {
149 $self->$method();
150 }
151
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 my $self_classname = ref $self;
162 eval("package $self_classname; use mixin '$package';");
163 #eval("use mixin_all '$package';");
164 if ($@) {
165 $meta->{loaded}->{$package} = 0;
166 $logger->error( __PACKAGE__ . "->load: $@" ) if $logger;
167 } else {
168 $meta->{loaded}->{$package} = 1;
169 }
170 }
171
172 sub unload {
173
174 my $self = shift;
175 my $modulename_unload = shift;
176
177 my $package = $self->_getPluginPackage($modulename_unload);
178
179 if ($meta->{loaded}->{$package}) {
180 $meta->{loaded}->{$package} = 0;
181 my $where = __PACKAGE__ . ':' . __LINE__;
182 $logger->debug( __PACKAGE__ . "->unload: FIXME: DESTROY object is not implemented at '$where'." ) if $logger;
183 }
184
185 }
186
187
188 sub boot {
189 my $self = shift;
190 $self->_abstract_function('boot');
191 }
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 }
201
202 1;

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