package CachedFile;
sub new {
my ($class, $name) = @_;
bless { name => $name , contents => "" }, $class;
}
sub name {
my ($self) = @_;
return \$self->{name};
}
####
${$cachedfile->name} = "a_long_file_name";
##
##
package Proxy;
sub for {
tie my($proxy), $_[0], @_[1..3];
return \$proxy;
}
sub TIESCALAR {
my ($class, $original, $postcheck, $message) = @_;
bless { original => $original,
postcheck => $postcheck,
message => $message, }, $class;
}
sub FETCH {
my ($self) = @_;
return ${$self->{original}};
}
sub STORE {
my ($self, $newval) = @_;
${$self->{original}} = $newval;
}
sub DESTROY {
my ($self) = @_;
croak $self->{message}
unless $self->{postcheck}->($self->{original});
}
##
##
package CachedFile;
sub new {
my ($class, $name) = @_;
bless { name => $name , contents => "" }, $class;
}
sub name {
my ($self) = @_;
return Proxy->for(\$self->{name},
sub{ length(${$_[0]}) <= 12 },
"File name too long!"
);
}
##
##
my $file = CachedFile->new("orig_name");
${$file->name} = "shrt_fl_nm"; # okay
${$file->name} = "a_long_file_name"; # KABOOM!