use multimethod cache to dispatch behavior at runtime