strat has asked for the wisdom of the Perl Monks concerning the following question:

Dear monks,

I want to write a very flexible and secure constructor (some people that only have little knowledge about perl will have to use this module). I just played around a bit, and the result was the attached testcode (I just used a blessed pseudohash to keep this example as easy as possible).

How would you do it? Are there better ways?

package Pseudo; # --------------------------------------------------------- sub new { my ($proto) = shift; unless (defined $proto){ die "ERROR: 'new' must be called as a class- or object-method\n"; } my $self = [{}]; if (ref $proto){ # call cloning constructor if needed return $proto->clone(); } # if else { # normal constructor; don't copy data bless ($self, $proto); } # else return ($self); } # new # --------------------------------------------------------- sub clone { my ($proto) = shift; if (__PACKAGE__ eq ref $proto){ my $self = [{}]; bless ($self, ref $proto); foreach (keys %$proto){ # copy keys, but not values $self->AddKey($_); } # foreach return ($self); } # if else { die "ERROR: 'clone' must be called as an object method\n"; } # else } # clone # --------------------------------------------------------- sub AddKey { my ($self, $key) = @_; if (exists $self->[0]->{$key}){ $DEBUG and warn "WARNING: Key $key already existing\n"; $self->{$key} = undef; # clear field } # if else { my $nextFreeIndex = scalar( keys %{ $self->[0] } ) + 1; $self->[0]->{$key} = $nextFreeIndex; # add key # $self->[$nextFreeIndex] = undef; } # else return $self; } # AddKey

Thank you in advance!

Best regards,
perl -e "s>>*F>e=>y)\*martinF)stronat)=>print,print v8.8.8.32.11.32"

Replies are listed 'Best First'.
•Re: Secure and still flexible OOP-constructor
by merlyn (Sage) on Jul 01, 2002 at 14:41 UTC
Re: Secure and still flexible OOP-constructor
by vladb (Vicar) on Jul 01, 2002 at 15:23 UTC
    In order to be able to fully participate in this discussion, I guess it would be helpful on your part to define what exactly is a 'very flexible and secure constructor'? I'll greatly appreciate it if you could fill me in on the exact purpose of this module. If your intended audience (users) are people having little knowledge of Perl, my suggestion is to have them learn more of it before jumping into OOP. Frankly, I've seen numerous instances of inapt Perl programmers wracking havoc with 'tools of trade' they have no practical knowledge of. The best 'secure' approach for you would be to teach them basics of OOP in Perl -- it's not tough by any measure. ;).

    _____________________
    # Under Construction
Re: Secure and still flexible OOP-constructor
by perrin (Chancellor) on Jul 01, 2002 at 15:59 UTC
    Hmmm... Why so much code? You don't need all this functionality. Besides switching to regular hashes (or using Damian's Tie::SecureHash module), you can get rid of all that prototype junk. It will only confuse beginners and I've never seen anyone actually call new() on objects rather than classes.