Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

comment on

( [id://3333]=superdoc: print w/replies, xml ) Need Help??
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

In reply to Re: OOP - redefining a class by etcshadow
in thread OOP - redefining a class by nmerriweather

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • 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.
Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having a coffee break in the Monastery: (3)
As of 2024-04-20 15:39 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found