note
pg
Yes, there is a way to avoid this. Starting from Perl 5.8, you can use the lock_keys function provided in Hash:Util package, to lock your attributes, after you initialized them.
One example here:
<code>
ex10.pm:
package ex10;
use Hash::Util;
sub new {
my $self = {};
$self->{ATTR_ABXCDEFG} = 1;
$self->{ATTR_ABCXDEFG} = 2;
$self->{ATTR_ABCDXEFG} = 3;
$self->{ATTR_ABCDEXFG} = 4;
$self->{ATTR_ABCDEFXG} = 5;
bless($self);
Hash::Util::lock_keys(%{$self});
return $self;
}
sub do_something_1 {
my $self = shift;
$self->{ATTR_ABCXDEFG} = 10;
}
sub do_something_2 {
my $self = shift;
print $self->{ATTR_ABCXDEFG};
}
sub do_something_3 {
my $self = shift;
$self->{ATTR_AXBCDEFG} = 10;
}
sub do_something_4 {
my $self = shift;
print $self->{ATTR_AXBCDEFG};
}
1;
ex10.pl:
use ex10;
$e = new ex10;
$e->do_something_1;
$e->do_something_2;
$e->do_something_3; #see what will happen, if you comment out this
$e->do_something_4; #try to comment out this
</code>
224434
224434