Metamodel::MROBasedMethodDispatch — 메서드 분해 순서 기반 메서드 찾기
Metamodel::MROBasedMethodDispatch — 메서드 분해 순서 기반 메서드 찾기
경고: 이 롤은 Rakudo 구현의 일부예요. 언어 명세에는 포함되지 않는 부분이랍니다.
이 롤은 서로 관련된(보통 "super"/"parent") 타입들의 메서드 분해 순서(Method Resolution Order, MRO) 를 따라 메서드를 찾는 일을 구현해요. MRO는 상속 구조에서 어떤 클래스의 메서드를 우선 호출할지 결정하는 순서예요. 이 롤은 바로 그 순서를 기준으로 메서드를 탐색하는 역할을 해요.
본문
method find_method
method find_method($obj, $name, :$no_fallback, *%adverbs)
메서드 이름을 받아, MRO에서 가장 가까운 그 이름의 메서드 객체 를 반환해요. 메서드를 찾지 못하면 VM 특유의 센티널 값(보통 저수준 NULL 값)을 반환하는데, 이 값은 정의됨(definedness) 검사로 판별할 수 있어요.
for <uppercase uc> {
Str.^find_method: $^meth andthen .("foo").say
orelse "method `$meth` not found".say
}
# OUTPUT:
# method `uppercase` not found
# FOO
:no_fallback를 주면 fallback 메서드는 고려하지 않아요.
method find_method_qualified
method find_method_qualified($obj, $type, $name)
메서드 이름과 타입을 받아, 그 타입에서 제공하는 메서드를 반환해요. 이런 호출에서 쓰이죠.
self.SomeParentClass::the_method();
method can
method can($obj, $name)
그 이름으로 객체가 호출할 수 있는 메서드들의 목록 을 반환해요.
method publish_method_cache
method publish_method_cache($obj)
MRO를 따라가며 메서드를 캐시에 추가해요. 단, 클래스 계층에서 더 낮은 곳의 다른 메서드가 그것을 "가렸다면"(shadowed) 추가하지 않아요.