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







All Articles