Bind a variable to a class attribute in Perl
This question arose from another ( Completely destroy all traces of an object in Perl ). After seeing some of the comments, I believe I have narrowed the problem down to a "real" problem.
I'm looking for an easy way to bind a variable to a class attribute in Perl so that whenever the attribute is changed the variable will be automatically updated.
ex (some pseudocode):
# Create a file object
my $file = File->new();
# Get the text
my $text = $file->text();
# prints 'hello'
print $text;
# Set the text
$file->text('goodbye');
# prints 'goodbye'
print $text;
Also I want the variable to be $text
read only so that you cannot inadvertently change the text
file attribute .
+3
source to share
1 answer
Use tie :
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
{ package File;
sub new {
bless ['hello'], shift
}
sub text {
my $self = shift;
if (@_) {
$self->[0] = shift;
} else {
return $self->[0]
}
}
}
{ package FileVar;
use Tie::Scalar;
use parent qw( -norequire Tie::StdScalar );
sub TIESCALAR {
my ($class, $obj) = @_;
bless \$obj, $class
}
sub FETCH {
my $self = shift;
${$self}->text()
}
sub STORE {
die 'Read only!';
# Or, do you want to change the object by changing the var, too?
my ($self, $value) = @_;
${$self}->text($value);
}
}
my $file = 'File'->new();
tie my $text, 'FileVar', $file;
say $text;
$file->text('goodbye');
say $text;
# Die or change the object:
$text = 'Magic!';
say $file->text;
+4
source to share