Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine

Re: OOP - redefining a class

by etcshadow (Priest)
on Jun 12, 2005 at 05:25 UTC ( #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?

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

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (7)
As of 2020-09-24 13:40 GMT
Find Nodes?
    Voting Booth?
    If at first I donít succeed, I Ö

    Results (133 votes). Check out past polls.