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.