시안의 아이디어는 훌륭한 출발점입니다.
약간의 조정만으로 일반적인 방법을 사용하는 것처럼 메서드 접근자를 만들 수 있습니다.
#!/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
코드 심판에 invocant 포함한 모든 인수를 전달합니다.
goto_frob
은 invocant를 포함한 모든 인수를 코드 ref에 전달하고 goto_frob
의 스택 프레임을 코드 refs로 바꿉니다.
어느 것이 스택에 원하는지에 따라 다릅니다.
그것은 당신이 OOP를 수행 할 때 캡슐화를 위반하는 것이 좋습니다 결코 그래서 $method->{body} = sub { 'foo' }
처럼 Class::MOP::Method
개체의 몸 스토리지를 munging에 관한
. 특히 Moose 및 Class :: MOP와 같은 복잡한 객체 시스템으로 작업 할 때는 그렇지 않습니다. 그것은 문제를 요구하고 있습니다. 때로는 원하는 것을 얻을 수있는 다른 방법이 없지만 캡슐화를 위반하는 것은 여전히 나쁜 생각입니다.
시안 아주 좋은 생각 :) 감사합니다. – xxxxxxx