public static IRubyObject invoke(InvokeSite site, ThreadContext context, IRubyObject self, Block block) throws Throwable {
// TODO: literal block handling of break, etc
RubyClass selfClass = self.getMetaClass();
String methodName = site.name;
SwitchPoint switchPoint = (SwitchPoint)selfClass.getInvalidator().getData();
CacheEntry entry = selfClass.searchWithCache(methodName);
DynamicMethod method = entry.method;
if (methodMissing(entry, CallType.NORMAL, methodName, self)) {
return callMethodMissing(entry, CallType.NORMAL, context, self, methodName);
}