Untested proof-of-concept. Run it only if you don't mind your hard disks being set on fire.
package Lvalue::GetSet;
use Exporter;
our @ISA=qw(Exporter);
our @EXPORT=qw(get set);
sub get(&@) :lvalue {
unshift @_, 'get';
goto &getset;
}
sub set(&@) :lvalue {
unshift @_, 'set';
goto &getset;
}
sub getset :lvalue {
if(@_ == 2) {
return @_;
}
elsif(@_ == 4) {
my $var;
tie $var, 'Lvalue::GetSet::Tie', @_;
$var;
}
else {
die "can't happen";
}
}
package Lvalue::GetSet::Tie;
sub TIESCALAR {
my($pkg, %obj)=@_;
bless \%obj, $pkg;
}
sub FETCH {
$_[0]->{get}->();
}
sub STORE {
$_[0]->{set}->($_[1]);
}
Usage would be something like:
sub name {
my $me=shift;
get {
$me->{name};
}
set {
die "Invalid name" unless $_[0] =~ /^(\w+)$/;
$me->{name} = $1;
}
}
What's wrong with something like this?
=cut
--Brent Dax
There is no sig.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|