public Object invoke(Object proxy, JavaProxyMethod m, Object[] nargs) throws Throwable { String name = m.getName(); DynamicMethod method = self.getMetaClass().searchMethod(name); int v = method.getArity().getValue(); IRubyObject[] newArgs = new IRubyObject[nargs.length]; for (int i = nargs.length; --i >= 0; ) { newArgs[i] = JavaUtil.convertJavaToUsableRubyObject(runtime, nargs[i]); } IRubyObject result = null; if (v < 0 || v == (newArgs.length)) { result = method.call(runtime.getCurrentContext(), self, self.getMetaClass(), name, newArgs); } else if (m.hasSuperImplementation()) { RubyClass superClass = self.getMetaClass().getSuperClass(); result = RuntimeHelpers.invokeAs(runtime.getCurrentContext(), superClass, self, name, newArgs, Block.NULL_BLOCK); } else { throw runtime.newArgumentError(newArgs.length, v); } if (m.getReturnType() == void.class) { return null; } else { return result.toJava(m.getReturnType()); } } }