package magic; sub TIESCALAR { my $class = shift; die "Incorrect number of parameters" if @_ % 2; my $self = bless {}, $class; $self->_Init(@_); return $self; } sub _Init { my ($self, %opt) = @_; $self->{PRE} = $opt{PRE} || sub { return uc $_[0] }; $self->{POST} = $opt{POST} || sub { my $val = shift; $val =~ s/FOO/BAR/; return $val; }; return; } sub STORE { my ($self, $value) = @_; $value = $self->{PRE}->( $value ); $value = $self->{POST}->( $value ); $self->{VAL} = $value; } sub FETCH { return $_[0]->{VAL} } ######################################## package cool; sub new { my $class = shift; tie my $name, "magic", @_; bless \$name, $class; } sub name :lvalue { ${$_[0]}; } ######################################## package main; tie my $string, "magic"; $string = 'My left foot'; print "$string\n"; my $obj = cool->new( 'POST' => sub { return reverse $_[0] } ); $obj->name = "My right foot"; print $obj->name, "\n";