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

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.


Comment on Re: how to avoid mis-spelling hash keys?
Download Code
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}) {

      =cut
      --Brent Dax
      There is no sig.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (15)
As of 2015-07-29 19:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (267 votes), past polls