Raku의 add_trustee — 다른 타입에 private 접근 허용하기

Raku의 add_trustee — 다른 타입에 private 접근 허용하기

클래스나 롤의 private 메서드는 기본적으로 자기 자신만 부를 수 있어요. 그런데 다른 타입이 내 private 메서드에 접근하게 만들고 싶을 때가 있죠. 그때 쓰는 선언이 trusts이고, 그 뒤에서 실제로 '이 타입을 신뢰한다'는 관계를 심어 주는 메타메서드가 add_trustee예요.

출처: Raku 공식 문서 — routine 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의 자리가 보여요. 예를 들어 클래스 BA를 신뢰한다고 선언하면, AB!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는 이런 신뢰 관계를 키워드 대신 메타프로그래밍으로 직접 넣고 싶을 때 쓰는 저수준 메서드예요.