add_fallback — 메서드 캐시에 없을 때의 대체 호출 등록
add_fallback — 메서드 캐시에 없을 때의 대체 호출 등록
클래스에 없는 메서드를 호출하면 보통 X::Method::NotFound가 나요. 하지만 FALLBACK을 정의하면 없을 때 호출되는 대체 처리를 만들 수 있죠. add_fallback은 바로 그 메타클래스 레벨의 버전이에요. 일반 코드에서는 FALLBACK 메서드를 쓰는 게 정석이고, 이건 메타클래스를 직접 만질 때 쓰는 저수준 API예요.
본문
In Metamodel::ClassHOW — 조건부 대체 메서드 설치
method add_fallback($obj, $condition, $calculator)
메서드 폴백(method fallback)을 설치해요. 쉽게 말하면 정적으로 추가되지 않은 메서드를 호출할 수 있게 해 주는 경로를 하나 더 만들어 주는 거예요.
$condition과 $calculator는 둘 다 콜러블(callable)이어야 해요. 메서드 캐시에서 찾을 수 없는 메서드가 호출되는 순간, 두 콜러블은 invocant와 메서드 이름을 인자로 받아 호출돼요. 흐름은 이렇게 나눠져요.
$condition이 참(true)을 돌려주면, 같은 인자로$calculator를 호출해요.$calculator는 메서드로 실행될 코드 객체를 돌려줘야 하고, 그 코드는 메서드 캐시에 추가돼요.$condition이 거짓(false)을 돌려주면 다음 폴백(있다면)을 시도해요. 결국 아무것도 일치하지 않으면X::Method::NotFound예외가 던져져요.
여기서 주의할 점이 하나 있어요. 일반 사용자 코드(메타클래스를 건드리지 않는 코드)에서는 이 메서드 대신 FALLBACK 메서드를 써야 해요. add_fallback은 메타클래스를 직접 다루는 저수준 작업에만 해당하는 API예요.