Raku의 add_trustee — 다른 타입에 private 접근 허용하기
Raku의 add_trustee — 다른 타입에 private 접근 허용하기
클래스나 롤의 private 메서드는 기본적으로 자기 자신만 부를 수 있어요. 그런데 다른 타입이 내 private 메서드에 접근하게 만들고 싶을 때가 있죠. 그때 쓰는 선언이 trusts이고, 그 뒤에서 실제로 '이 타입을 신뢰한다'는 관계를 심어 주는 메타메서드가 add_trustee예요.
시그니처
method add_trustee($type, Mu $trustee)
$trustee를 신뢰하는 관계로 추가해요. Metamodel::Trusting 롤이 구현하는데, 이 롤은 Rakudo 구현의 일부라 언어 명세에는 포함되지 않아요. 보통은 add_trustee를 직접 부르기보다 trusts 키워드가 이 메커니즘을 대신 써 줘요.
class A {
BEGIN A.^add_trustee(B);
# 위는 'trusts B' 와 같은 의미
}
왜 필요한지
trusts의 동작을 이해하면 add_trustee의 자리가 보여요. 예를 들어 클래스 B가 A를 신뢰한다고 선언하면, A는 B의 !private_method 같은 private 메서드를 부를 수 있게 돼요.
class A {
my class B {
trusts A; # 여기서 Metamodel::Trusting이 등장
method !private_method() {
say "B 안의 private 메서드";
}
}
method build-and-poke {
# B가 A를 신뢰하지 않으면 이 호출은 금지돼요
B.new()!B::private_method();
}
};
A.build-and-poke; # B 안의 private 메서드
add_trustee는 이런 신뢰 관계를 키워드 대신 메타프로그래밍으로 직접 넣고 싶을 때 쓰는 저수준 메서드예요.