Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re: OOP - redefining a class

by etcshadow (Priest)
on Jun 12, 2005 at 05:25 UTC ( [id://465907]=note: print w/replies, xml ) Need Help??


in reply to OOP - redefining a class

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

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://465907]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having an uproarious good time at the Monastery: (7)
As of 2024-03-28 17:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found