public static IRubyObject invocationFallback(JRubyCallSite site, ThreadContext context, IRubyObject caller, IRubyObject self, IRubyObject arg0, IRubyObject arg1, IRubyObject arg2) throws Throwable {
RubyClass selfClass = pollAndGetClass(context, self);
String method = site.name();
SwitchPoint switchPoint = (SwitchPoint)selfClass.getInvalidator().getData();
CacheEntry entry = selfClass.searchWithCache(method);
if (methodMissing(entry, site.callType(), method, caller)) {
IRubyObject mmResult = callMethodMissing(entry, site.callType(), context, self, method, arg0, arg1, arg2);
// TODO: replace with handle logic
return site.isAttrAssign() ? arg2 : mmResult;
}