in reply to Re: Inheritance: parent class determine which child class to use?
in thread Inheritance: parent class determine which child class to use?
Thanks! I made some modifications and used the idea. Mine turned out something like:
...1 package Local::Multipath; ... 45 my %mpByType; 46 47 sub new { 48 my ($class, %opts) = @_; 49 return bless \%opts, $class; 50 } 51 52 sub factory { 53 my (%opts) = @_; 54 croak ("Missing parameters!") unless exists $opts{co}; 55 my $type = _whichType; 56 my $module = "Local::Multipath::$type"; 57 { 58 eval "use $module"; 59 } 60 croak "Failed to load module $module: $@\n" if $@; 61 $mpByType{$type}->new (%opts); 62 } 63 64 sub REGISTER_TYPE { 65 my ($type) = @_; 66 my ($name) = $type =~ m/Multipath::(.*)/; 67 $mpByType{$name} = $type; 68 }
... somewhere else in code land ...1 package Local::Multipath::DMMP; 2 use strict; 3 use warnings; ... 7 8 REGISTER_TYPE Local::Multipath::DMMP; ...
my $mp = Local::Multipath::factory (co => $conf);
The _whichType function returns 'DMMP' or 'Powerpath' after sniffing around for what we actually have.
It's nearly the same as what you suggested, but I didn't need the added 'type' attribute in this case, so simpler.
I could almost get away without the REGISTER_TYPE, but it has the added appeal of not having to hard code the things Multipath can handle. Just add a new module like the DMMP module shown to add new capabilities;
Thanks for the suggestion: perfect synergy.
|
|---|