perlquestion
dada
can you tell me, looking at the following code:
<ol type="a">
<li>what is wrong
<li>the most elegant way to fix it
<li>what can be done to avoid similar errors
</ol>
<readmore>
<b>UPDATE</b>: this is <i>bad code</i>, I know. it's just a completely fake example I made up for this post. it's also deliberately contrived, just to make the real problem less apparent (and where's the fun, otherwise? :-). you have been warned. don't do this at home.
<code>
package SomeData;
# UPDATE: the first version of "new" doesn't seem to
# work on some platform/version combination (and it's
# way too evil anyway). but since this is not the main
# issue, I will use a more "sane" version :-)
# sub new { bless \pop, shift }
sub new { my $self = pop; bless \$self, shift }
sub value { ${shift;} }
sub add {
my($self, $type, $value) = @_;
if($type eq 'number') { return $$self += $value; }
if($type eq 'string') { return $$self .= $value; }
die "only string or number allowed";
}
sub increment {
my $self = shift;
$self->add(number => 1);
}
package MyNumber;
use base qw( SomeData );
sub add {
my($self, $value) = @_;
die "not a number" unless $value =~ /^\d+$/;
$$self += $value;
}
sub subtract {
my($self, $value) = @_;
die "not a number" unless $value =~ /^\d+$/;
$$self -= $value;
}
package main;
my $answer = MyNumber->new(42);
print $answer->value(), "\n";
$answer->subtract(1);
print $answer->value(), "\n";
$answer->increment();
print $answer->value(), "\n";
</code>
</readmore>
<div class="pmsig">
<div class="pmsig-14199">
cheers,<br>
Aldo
<p>
King of Laziness, Wizard of Impatience, Lord of Hubris
</div></div>