Yeah, it's not at all uncommon of a pattern. It also happens to be quite easily done in perl. Remember that an object is just a reference
blessed into a package (or, more to the point, blessed into the
name of a package).
Something along these lines is a common approach:
sub new {
my ($class, @args) = @_;
my $destination_class = figure_destination_class(@args); # or whate
+ver
my $self = bless {}, $destination_class;
$self->initialize(@args);
return $self;
}
One important note is that you'll want to move any actual initialization logic that might have been part of new out to another method (I called initialize), so that a subclass would have the ability to overload that logic, after the subclass is determined, and the object is blessed into that package.
There are some potential gotchas, of course. Mostly to do with the questions of what the potential sub-classes are, and if/whether you automatically load their code on the fly. For example, you could extend the above to something along the lines of this:
sub new {
my ($class, @args) = @_;
my $destination_class = figure_destination_class(@args); # or whate
+ver
# verify that the $destination_class is a valid package name
# and a proper sub-namespace of $class, and detaint
if ($destination_class =~ /^(\Q$class\E(?:::[a-zA-Z_]\w*)+)$/)) {
eval "require $1" or die $@;
}
else {
die "'$destination_class' is an invalid class name for sub-class
+es of $class\n";
}
my $self = bless {}, $destination_class;
$self->initialize(@args);
return $self;
}
Which does some checking of the package name before loading it (generally people refer to this act as "detainting", as it has the side effect of allowing a taint-check-enabled script to still do this ok... if you construct it properly).
------------
:Wq
Not an editor command: Wq
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.