Remember: encapsulation is not about preventing access to attributes; it's about controlling access to attributes.
If you want the control that the AUTOLOAD enforces to be identical to the control that Tie::SecureHash enforces (which is a perfectly reasonable thing to want), just code AUTOLOAD accordingly:
sub AUTOLOAD { my ($self, $newval) = @_; $AUTOLOAD =~ s/.*:://; my $attr; if (exists $self->{$attr=$AUTOLOAD}) { # public attribute always accessible } elsif (exists $self->{$attr="_$AUTOLOAD"}) { croak "Cannot access protected attribute '$attr'" unless caller().isa(ref $self); } elsif (exists $self->{$attr="__$AUTOLOAD"}) { croak "Cannot access private attribute '$attr'" unless caller() eq ref $self; } else { croak "No such attribute ($AUTOLOAD) for object" } $self->{$attr} = $newval if @_ > 1; return $self->{$attr}; }
In reply to Re: Re: Re: Tie::SecureHash and AUTOLOAD'ing
by TheDamian
in thread Tie::SecureHash and AUTOLOAD'ing
by forkboy
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |