Beside a memory leak, there's the possibility of a subtle bug.
I had to modify your code slightly, but consider the following class:
use strict;
use warnings;
package Class::SomeMethodMaker;
sub create_accessor {
my %hash = ();
return sub {
my ($self, $value) = @_;
$hash{$self} = $value if @_ > 1;
return $hash{$self};
}
}
package MyClass;
{ no strict 'refs';
*{"MyClass::colour"} = Class::SomeMethodMaker::create_accessor;
}
sub new {bless {}, shift}
1;
__END__
It's a simple class with a single accessor.
Now I use this class in the following way:
use strict;
use warnings;
use MyClass;
for my $colour (qw /green yellow/) {
my $obj = MyClass->new;
$obj->colour($colour) unless $obj->colour;
print $obj->colour, "\n";
}
__END__
You would expect it to print
green\nyellow\n. However, it prints
green\ngreen\n. The problem is that references are unique - but only references that exist at the same moment in time. References are not necessarely unique over time - they may be reused. Your technique only works if you do some work at DESTROY time - and that makes it trickier.