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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.4 by joko, Mon Jan 20 16:55:15 2003 UTC revision 1.7 by joko, Tue Feb 11 10:34:19 2003 UTC
# Line 2  Line 2 
2  ##  $Id$  ##  $Id$
3  ## --------------------------------------------------------------------------------  ## --------------------------------------------------------------------------------
4  ##  $Log$  ##  $Log$
5    ##  Revision 1.7  2003/02/11 10:34:19  joko
6    ##  + loaded module may now lack 'mixin::with' declaration
7    ##  + this gets us the possibility to load modules from any perl namespace
8    ##     + enabled this mechanism
9    ##
10    ##  Revision 1.6  2003/02/09 16:22:51  joko
11    ##  + pseudo constructor mechanism via options
12    ##
13    ##  Revision 1.5  2003/01/31 01:19:50  root
14    ##  + fixed: doesn't need Log::Dispatch any more, but uses it if available
15    ##
16  ##  Revision 1.4  2003/01/20 16:55:15  joko  ##  Revision 1.4  2003/01/20 16:55:15  joko
17  ##  + sub mixinPackage  ##  + sub mixinPackage
18  ##  + sub include  ##  + sub include
# Line 29  use Data::Dumper; Line 40  use Data::Dumper;
40    
41  ## ========   object inheritance   ========  ## ========   object inheritance   ========
42    
43  # TODO:  # TODO / REFACTORING PROPOSAL
44    # leading from Data::Storage to code abstracted out into this module - DesignPattern::Bridge
45  #   - this is no inheritance and it doesn't have to be  #   - this is no inheritance and it doesn't have to be
46  #   - implement this module as a bridge to its sub-modules  #   - implement this module as a bridge to its sub-modules
47  #   - use the BridgePattern (http://c2.com/cgi/wiki?BridgePattern)  #   - use the BridgePattern (http://c2.com/cgi/wiki?BridgePattern)
# Line 40  use Data::Dumper; Line 52  use Data::Dumper;
52  #   - sub getChildNodes  #   - sub getChildNodes
53  #   - sub run  #   - sub run
54    
55    # 2003-02-11, joko: does this have anything in parallel with CPAN's Class::Inner?
56    
57    
58  # get logger instance  # get logger instance
59  my $logger = Log::Dispatch::Config->instance;  my $logger = eval { Log::Dispatch::Config->instance; };
60        
61  my $meta;  my $meta;
62    
63  ## ========   object constructor   ========  ## ========   object constructor   ========
64    sub new {  sub new {
65      my $invocant = shift;    my $invocant = shift;
66      my $class = ref($invocant) || $invocant;    my $class = ref($invocant) || $invocant;
67      my @args = ();    my @args = ();
68      @_ && (@args = @_);    @_ && (@args = @_);
69      $logger->debug( __PACKAGE__ . "->new(@args)" );    $logger->debug( __PACKAGE__ . "->new(@args)" ) if $logger;
70      my $self = { @_ };    my $self = { @_ };
71    
72      # trace
73      #print "class: $class", "\n";      #print "class: $class", "\n";
74      bless $self, $class;  
75      ##if (my $bizWorks = shift) {    # create instance
76        ##$self->boot($bizWorks);    bless $self, $class;
77      ##}    
78          return $self;
79      return $self;  }
   }  
80    
81    
82  ## ========   method overrider   ========  ## ========   method overrider   ========
# Line 74  my $meta; Line 90  my $meta;
90      my $method = $AUTOLOAD;      my $method = $AUTOLOAD;
91      $method =~ s/^.*:://;      $method =~ s/^.*:://;
92        
93      $logger->debug( __PACKAGE__ . "->" . $method . "(@_)" . " (AUTOLOAD called, not dispatched)" );      $logger->debug( __PACKAGE__ . "->" . $method . "(@_)" . " (AUTOLOAD called, not dispatched)" ) if $logger;
94    
95      ## ->DESTROY would - if not declared - trigger an AUTOLOAD also      ## ->DESTROY would - if not declared - trigger an AUTOLOAD also
96      return if $method =~ m/::DESTROY$/;      return if $method =~ m/::DESTROY$/;
# Line 95  my $meta; Line 111  my $meta;
111            
112      # build full package name      # build full package name
113      my $self_classname = ref $self;      my $self_classname = ref $self;
114      my $package = $self_classname . '::' . $modulename_load;        # name
115          my $package = $modulename_load;
116          
117          # if package is absolute, cut away prefix ('/' or '::')
118          if ($package !~ s/^:://) {
119            # else: prefix with base classname if above name is relative (lacks of '/' or '::')
120            $package = $self_classname . '::' . $package
121          }
122        
123      return $package;      return $package;
124    }    }
125        
# Line 104  my $meta; Line 128  my $meta;
128      my $self = shift;      my $self = shift;
129      my $modulename_load = shift;      my $modulename_load = shift;
130    
131        my $options = shift;
132    
133      my $self_modulename = ref $self;      my $self_modulename = ref $self;
134      my $package = $self->_getPluginPackage($modulename_load);      my $package = $self->_getPluginPackage($modulename_load);
135            
# Line 111  my $meta; Line 137  my $meta;
137        return 1;        return 1;
138      }      }
139            
140      #$logger->info( __PACKAGE__ . "->load: $package" );      #$logger->info( __PACKAGE__ . "->load: $package" ) if $logger;
141      #$logger->info( __PACKAGE__ . "->load: $self_modulename" );      #$logger->info( __PACKAGE__ . "->load: $self_modulename" ) if $logger;
142      $logger->debug( $self_modulename . "->load: $package\t[via " . __PACKAGE__ . "]" );      $logger->debug( $self_modulename . "->load: $package\t[via " . __PACKAGE__ . "]" ) if $logger;
143    
144      # this is the module testing phase - use mixin doesn't seem to propagate errors by default      # this is the module testing phase - use mixin doesn't seem to propagate errors by default
145      eval("use $package;");      eval("use $package;");
# Line 122  my $meta; Line 148  my $meta;
148        # include caller information        # include caller information
149        my @caller = caller;        my @caller = caller;
150        my $caller_msg = $caller[1] . ':' . $caller[2];        my $caller_msg = $caller[1] . ':' . $caller[2];
151        $logger->error( __PACKAGE__ . "->load: $@ ($caller_msg)" );        my $msg =  __PACKAGE__ . "->load: $@ ($caller_msg)";
152          if ($logger) {
153            $logger->error($msg);
154          } else {
155            print $msg, "\n";
156          }
157      }      }
158    
159  #print "ref-1: ", ref $self, "\n";  #print "ref-1: ", ref $self, "\n";
# Line 132  my $meta; Line 163  my $meta;
163      #bless $self, $package;      #bless $self, $package;
164    
165      # V2:      # V2:
166      # switch into foreign package and mixin plugin-module  
167      $self->mixinPackage($package);      # switch into foreign package and prepare for mixin
168        $self->mixin_prepare($package);
169    
170        # switch into local package (scope which uses DesignPattern::Bridge) and mixin plugin-module
171        $self->mixin_do($package);
172    
173        if (my $method = $options->{method}) {
174          $self->$method();
175        }
176    
177      return 1;      return 1;
178            
179    }    }
180    
181    # TODO: maybe refactor to DesignPattern::Object? what about the '$logger'?    # TODO: maybe refactor to DesignPattern::Object? what about the '$logger'?
182    sub mixinPackage {    sub mixin_prepare {
183        my $self = shift;
184        my $package = shift;
185        my $self_classname = ref $self;
186        eval("package $package; use mixin::with '$self_classname';");
187    
188        # FIXME: --- this is redundant ---
189        if ($@) {
190          $meta->{loaded}->{$package} = 0;
191          $logger->error( __PACKAGE__ . "->load: $@" ) if $logger;
192        } else {
193          $meta->{loaded}->{$package} = 1;
194        }
195        # FIXME: --- this is redundant ---
196    
197      }
198    
199      sub mixin_do {
200      my $self = shift;      my $self = shift;
201      my $package = shift;      my $package = shift;
202      # switch into foreign package and mixin plugin-module      # switch into foreign package and mixin plugin-module
203      my $self_classname = ref $self;      my $self_classname = ref $self;
204      eval("package $self_classname; use mixin '$package';");      eval("package $self_classname; use mixin '$package';");
205      #eval("use mixin_all '$package';");      #eval("use mixin_all '$package';");
206    
207        # FIXME: --- this is redundant ---
208      if ($@) {      if ($@) {
209        $meta->{loaded}->{$package} = 0;        $meta->{loaded}->{$package} = 0;
210        $logger->error( __PACKAGE__ . "->load: $@" );        $logger->error( __PACKAGE__ . "->load: $@" ) if $logger;
211      } else {      } else {
212        $meta->{loaded}->{$package} = 1;        $meta->{loaded}->{$package} = 1;
213      }      }
214        # FIXME: --- this is redundant ---
215    
216    }    }
217    
218    sub unload {    sub unload {
# Line 165  my $meta; Line 225  my $meta;
225      if ($meta->{loaded}->{$package}) {      if ($meta->{loaded}->{$package}) {
226        $meta->{loaded}->{$package} = 0;        $meta->{loaded}->{$package} = 0;
227        my $where = __PACKAGE__ . ':' . __LINE__;        my $where = __PACKAGE__ . ':' . __LINE__;
228        $logger->debug( __PACKAGE__ . "->unload: FIXME: DESTROY object is not implemented at '$where'." );        $logger->debug( __PACKAGE__ . "->unload: FIXME: DESTROY object is not implemented at '$where'." ) if $logger;
229      }      }
230    
231    }    }
# Line 186  my $meta; Line 246  my $meta;
246    }    }
247    
248  1;  1;
249    __END__

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.7

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