思南的想法是一个很好的开始。
但是通过一些额外的调整,您可以像使用普通方法一样使用您的方法访问器。
#!/usr/bin/perl
use strict;
use warnings;
use Carp;
my $f = Frob->new;
$f->frob(
sub {
my $self = shift;
print "$self was frobbed\n";
print Carp::longmess('frob')
}
);
print "\nCall frob as normal sub\n";
$f->frobit;
print "\nGoto frob\n";
$f->goto_frob;
BEGIN {
package Frob;
use Moose;
has 'frob' => (
is => 'rw',
isa => 'CodeRef',
);
sub frobit {
&{$_[0]->frob};
}
sub goto_frob {
goto $_[0]->frob;
}
}
中的两种方法Frob
非常相似。
frobit
将所有参数(包括调用者)传递给代码参考。
goto_frob
将所有参数(包括调用者)传递给代码引用,并用代码引用替换goto_frob
的堆栈帧。
使用哪个取决于您想要在堆栈中的内容。
关于修改Class::MOP::Method
对象的身体存储,如下所示$method->{body} = sub { 'foo' }
:
在进行 OOP 时,违反封装绝不是一个好主意。尤其是当您使用 Moose 和 Class::MOP 等复杂对象系统时。这是自找麻烦。有时,没有其他方法可以得到你想要的东西,但即便如此,违反封装仍然是一个坏主意。