@LeolaMethod(alias="implements")
	public LeoObject _implements(final String interfaceName, final LeoObject leoMethods) throws Exception {
		Class<?> jClass = Class.forName(interfaceName);
		Object obj = Proxy.newProxyInstance(ReflectionLeolaLibrary.class.getClassLoader(), new Class[] {jClass}, new InvocationHandler() {
			
			@Override
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {
				
				LeoObject[] largs = ArrayUtil.EMPTY_LEOOBJECTS;
				if(args!=null && args.length > 0) {
					largs = new LeoObject[args.length];
					for(int i = 0; i < args.length; i++) {
						largs[i] = LeoObject.valueOf(args[i]);
					}
				}
				
				String methodName = method.getName();
				
				LeoObject leoMethod = leoMethods;
				try {
					leoMethod = leoMethods.getObject(LeoString.valueOf(methodName));
				}
				catch(Exception e) {}
				
				if(leoMethod == LeoNull.LEONULL) {
					if(methodName.equals("toString")) {
						return "Proxy for: " + interfaceName;
					}
					if(methodName.equals("equals")) {
						return proxy.equals(args[0]);
					}
					if(methodName.equals("hashCode")) {
						return proxy.hashCode();
					}
				}
				
				LeoObject res = leoMethod.xcall(largs);
				return LeoObject.toJavaObject(method.getReturnType(), res);
			}
		});
		
		LeoNativeClass aClass = new LeoNativeClass(obj);
		/*
		List<Method> methods = ClassUtil.getAllDeclaredMethods(jClass);
		for(Method m : methods) {
			boolean isPublic= (m.getModifiers() & Modifier.PUBLIC) != 0;
			if(isPublic) {
				aClass.setMember(LeoString.valueOf(m.getName()), new LeoNativeFunction(m, obj));
			}
		}*/
		
		return aClass;
	}