답변:
Perl 5의 Moose와 유사하게 클래스 메소드를 수정하는 데 사용할 수있는 before (), after () 및 around () 함수를 구현합니다. 내부적으로 wrap ()을 사용하고 래퍼 핸들러를 반환하므로 원본을 쉽게 .restore () 할 수 있습니다.
모듈이 구현하는 방법은 around
다음과 같습니다.
sub around ($class, $method-name, &closure) is export
{
$class.^find_method($method-name).wrap(method { closure(); });
}
사용하다 wrap
sub bar () { return "baþ" };
my $wrapped = &bar.wrap( { " → " ~ callsame() ~ " ← " } );
say bar(); # OUTPUT: «→ baþ ← »
방법은 루틴이기 때문에, 당신은 방법 자체에 대한 핸들을 얻을 수있는 약간 더 뒤얽힌 방법이 필요합니다,하지만 이후 그 이외의 방법은 완전히 동일 Method
들 의 하위 클래스 Routine
의
class Baz {
method bar () { return "baþ" };
}
my &method_bar = Baz.^find_method("bar");
my $wrapped = &method_bar.wrap( { " → " ~ callsame() ~ " ← " } );
say Baz.bar(); # OUTPUT: «→ baþ ← »
는 $wrapped
, 이후에 사용할 수 있습니다 필요한 경우 포장을 푸는하는 핸들입니다.
편집 : 클래스 메소드에 대한 핸들을 가져 오는 코드를 추가 하십시오 (예 : here ).
Method
A는Routine
Moo
s는 서브 루틴을 감싸는 것과는 다릅니다.