Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number

Re: how to avoid mis-spelling hash keys?

by FamousLongAgo (Friar)
on Jan 05, 2003 at 18:31 UTC ( #224447=note: print w/replies, xml ) Need Help??

in reply to how to avoid mis-spelling hash keys?

Another tack is to wrap the attributes in accessor methods. E.g,
sub get_attr { $_[0]->{'attr'} } sub set_attr { $_[0]->{'attr'} = $_[1] }
Now if you misspell an attribute name, it gives you a run-time error.

Some people hate this approach and call it monkey code, I like it because it documents the object's interface, and lets you change the internal implementation away from a hash if you like. If you really hate writing accessors, consider Class::MethodMaker.

Whatever else, Damian Conway's book (cited above) is invaluable for OO Perl.

Replies are listed 'Best First'.
Re: Re: how to avoid mis-spelling hash keys?
by crouchingpenguin (Priest) on Jan 06, 2003 at 16:14 UTC
    I like to use AUTOLOAD for my accessors like:
    sub AUTOLOAD { my $self = shift; return unless ref($self); # lets find out what the mysterious missing func is my ($attribute) = $AUTOLOAD =~ m/.*::(.*)/; # this is our psuedo get/set # we can make this as simple or complex as we want if( my $value = shift ){ ### we have an argument # if attribute exists # this is our sort of rudimentary access control # so we can't create arbitrary attributes if( exists $self->{$attribute} ){ $self->{$attribute} = $value; }elsif( exists $self->{ lc($attribute) } ){ # double check caller didn't mean lower case $self->{ lc($attribute) } = $value; }else{ # we can put assignment code here if # we want to be able to automatically # create object attributes on the fly } # here is a good place to call your commit() # or write() method if applicable $self->write(); }else{ # must be an get type call return $self->{$attribute} if exists $self->{$attribute}; return $self->{lc($attribute)} if exists $self->{lc($attribute)}; }# end if/elsif/else value = shift }

    Update: BrentDax is spot on

    "Never be afraid to try something new. Remember, amateurs built the ark. Professionals built the Titanic."
         if( $self­->{$a­ttrib­ute} ){
      That will fail if $self->{$attribute} is set to zero, the empty string, or undef. Perhaps this would work better:

         if(exists $self->{$attribute}) {

      --Brent Dax
      There is no sig.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://224447]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (13)
As of 2018-06-25 20:19 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (128 votes). Check out past polls.