// Path: src/main/java/com/naef/jnlua/JavaReflector.java
// public enum Metamethod {
// 	/**
// 	 * <code>__index</code> metamethod.
// 	 */
// 	INDEX,
// 
// 	/**
// 	 * <code>__newindex</code> metamethod.
// 	 */
// 	NEWINDEX,
// 
// 	/**
// 	 * <code>__len</code> metamethod.
// 	 */
// 	LEN,
// 
// 	/**
// 	 * <code>__eq</code> metamethod.
// 	 */
// 	EQ,
// 
// 	/**
// 	 * <code>__lt</code> metamethod.
// 	 */
// 	LT,
// 
// 	/**
// 	 * <code>__le</code> metamethod.
// 	 */
// 	LE,
// 
// 	/**
// 	 * <code>__unm</code> metamethod.
// 	 */
// 	UNM,
// 
// 	/**
// 	 * <code>__add</code> metamethod.
// 	 */
// 	ADD,
// 
// 	/**
// 	 * <code>__sub</code> metamethod.
// 	 */
// 	SUB,
// 
// 	/**
// 	 * <code>__mul</code> metamethod.
// 	 */
// 	MUL,
// 
// 	/**
// 	 * <code>__div</code> metamethod.
// 	 */
// 	DIV,
// 
// 	/**
// 	 * <code>__mod</code> metamethod.
// 	 */
// 	MOD,
// 
// 	/**
// 	 * <code>__pow</code> metamethod.
// 	 */
// 	POW,
// 
// 	/**
// 	 * <code>__concat</code> metamethod.
// 	 */
// 	CONCAT,
// 
// 	/**
// 	 * <code>__call</code> metamethod.
// 	 */
// 	CALL,
// 
// 	/**
// 	 * <code>__tostring</code> metamethod.
// 	 */
// 	TOSTRING,
// 		
// 	/**
// 	 * <code>__pairs</code> metamethod,
// 	 */
// 	PAIRS,
// 		
// 	/**
// 	 * <code>__ipairs</code> metamethod,
// 	 */
// 	IPAIRS,
// 
// 	/**
// 	 * <code>__javafields</code> metamethod.
// 	 */
// 	JAVAFIELDS,
// 
// 	/**
// 	 * <code>__javamethods</code> metamethod.
// 	 */
// 	JAVAMETHODS,
// 
// 	/**
// 	 * <code>__javaproperties</code> metamethod.
// 	 */
// 	JAVAPROPERTIES;
// 
// 	// -- Operations
// 	/**
// 	 * Returns the Lua metamethod name.
// 	 * 
// 	 * @return the metamethod name
// 	 */
// 	public String getMetamethodName() {
// 		return "__" + toString().toLowerCase();
// 	}
// };


import java.lang.reflect.Array;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.naef.jnlua.JavaReflector.Metamethod;

				} else {
					String interfaceName = luaState.checkString(i + 2);
					interfaces[i] = loadType(luaState, interfaceName);
				}
			}

			// Create proxy
			luaState.pushJavaObjectRaw(luaState.getProxy(1, interfaces));
			return 1;
		}

		@Override
		public String getName() {
			return "proxy";
		}
	}

	/**
	 * Provides the pairs iterator from the Java reflector.
	 */
	private static class Pairs implements NamedJavaFunction {
		// -- NamedJavaFunction methods
		@Override
		public int invoke(LuaState luaState) {
			luaState.checkArg(
					1,
					luaState.isJavaObjectRaw(1),
					String.format("Java object expected, got %s",
							luaState.typeName(1)));
			JavaFunction metamethod = luaState.getMetamethod(

// Path: src/main/java/com/naef/jnlua/JavaReflector.java
// public enum Metamethod {
// 	/**
// 	 * <code>__index</code> metamethod.
// 	 */
// 	INDEX,
// 
// 	/**
// 	 * <code>__newindex</code> metamethod.
// 	 */
// 	NEWINDEX,
// 
// 	/**
// 	 * <code>__len</code> metamethod.
// 	 */
// 	LEN,
// 
// 	/**
// 	 * <code>__eq</code> metamethod.
// 	 */
// 	EQ,
// 
// 	/**
// 	 * <code>__lt</code> metamethod.
// 	 */
// 	LT,
// 
// 	/**
// 	 * <code>__le</code> metamethod.
// 	 */
// 	LE,
// 
// 	/**
// 	 * <code>__unm</code> metamethod.
// 	 */
// 	UNM,
// 
// 	/**
// 	 * <code>__add</code> metamethod.
// 	 */
// 	ADD,
// 
// 	/**
// 	 * <code>__sub</code> metamethod.
// 	 */
// 	SUB,
// 
// 	/**
// 	 * <code>__mul</code> metamethod.
// 	 */
// 	MUL,
// 
// 	/**
// 	 * <code>__div</code> metamethod.
// 	 */
// 	DIV,
// 
// 	/**
// 	 * <code>__mod</code> metamethod.
// 	 */
// 	MOD,
// 
// 	/**
// 	 * <code>__pow</code> metamethod.
// 	 */
// 	POW,
// 
// 	/**
// 	 * <code>__concat</code> metamethod.
// 	 */
// 	CONCAT,
// 
// 	/**
// 	 * <code>__call</code> metamethod.
// 	 */
// 	CALL,
// 
// 	/**
// 	 * <code>__tostring</code> metamethod.
// 	 */
// 	TOSTRING,
// 		
// 	/**
// 	 * <code>__pairs</code> metamethod,
// 	 */
// 	PAIRS,
// 		
// 	/**
// 	 * <code>__ipairs</code> metamethod,
// 	 */
// 	IPAIRS,
// 
// 	/**
// 	 * <code>__javafields</code> metamethod.
// 	 */
// 	JAVAFIELDS,
// 
// 	/**
// 	 * <code>__javamethods</code> metamethod.
// 	 */
// 	JAVAMETHODS,
// 
// 	/**
// 	 * <code>__javaproperties</code> metamethod.
// 	 */
// 	JAVAPROPERTIES;
// 
// 	// -- Operations
// 	/**
// 	 * Returns the Lua metamethod name.
// 	 * 
// 	 * @return the metamethod name
// 	 */
// 	public String getMetamethodName() {
// 		return "__" + toString().toLowerCase();
// 	}
// };


// Path: src/main/java/com/naef/jnlua/JavaModule.java
import java.lang.reflect.Array;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.naef.jnlua.JavaReflector.Metamethod;

				} else {
					String interfaceName = luaState.checkString(i + 2);
					interfaces[i] = loadType(luaState, interfaceName);
				}
			}

			// Create proxy
			luaState.pushJavaObjectRaw(luaState.getProxy(1, interfaces));
			return 1;
		}

		@Override
		public String getName() {
			return "proxy";
		}
	}

	/**
	 * Provides the pairs iterator from the Java reflector.
	 */
	private static class Pairs implements NamedJavaFunction {
		// -- NamedJavaFunction methods
		@Override
		public int invoke(LuaState luaState) {
			luaState.checkArg(
					1,
					luaState.isJavaObjectRaw(1),
					String.format("Java object expected, got %s",
							luaState.typeName(1)));
			JavaFunction metamethod = luaState.getMetamethod(

					luaState.toJavaObjectRaw(1), Metamethod.PAIRS);
