package Parenthise;
sub parenthise {
my($class, $field_name) = @_;
my $fullname = join ('::', $class, $field_name);
my $coderef;
my $set_coderef = "\$coderef = $fullname;";
eval $set_coderef;
my $replace_sub = sub {
my ($self, $value) = @_;
if(@_ > 1){
return $coderef->($self);
}else{
return $coderef->($self, "($value)");
}
};
# here's where the trouble starts
my $switcheroo = sprintf(<<"HERE" , $class, $field_name, $field_name);
package %s;
undef &{ *%s{CODE} };
*%s = \$coderef;
HERE
eval $switcheroo;
}
1;
####
package SomePackage;
use Class::MethodMaker get_set => [qw/value/], new_with_init => 'new';
use Parenthise;
Parenthise::parenthise(__PACKAGE__, 'value');
1;
##
##
use Somepackage;
my $thing = Somepackage->new();
$thing->value('bar');
$thing->value eq '(bar)';