// 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.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashSet;
import java.util.Set;
import com.naef.jnlua.JavaReflector.Metamethod;

	 * @see #getClassLoader()
	 * @see #setClassLoader(ClassLoader)
	 * @see #getJavaReflector()
	 * @see #setJavaReflector(JavaReflector)
	 * @see #getConverter()
	 * @see #setConverter(Converter)
	 */
	public LuaState() {
		this(0L);
	}

	/**
	 * Creates a new instance.
	 */
	private LuaState(long luaState) {
		ownState = luaState == 0L;
		lua_newstate(APIVERSION, luaState);
		check();

		// Create a finalize guardian
		finalizeGuardian = new Object() {
			@Override
			public void finalize() {
				synchronized (LuaState.this) {
					closeInternal();
				}
			}
		};

		// Add metamethods

// 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/LuaState.java
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashSet;
import java.util.Set;
import com.naef.jnlua.JavaReflector.Metamethod;

	 * @see #getClassLoader()
	 * @see #setClassLoader(ClassLoader)
	 * @see #getJavaReflector()
	 * @see #setJavaReflector(JavaReflector)
	 * @see #getConverter()
	 * @see #setConverter(Converter)
	 */
	public LuaState() {
		this(0L);
	}

	/**
	 * Creates a new instance.
	 */
	private LuaState(long luaState) {
		ownState = luaState == 0L;
		lua_newstate(APIVERSION, luaState);
		check();

		// Create a finalize guardian
		finalizeGuardian = new Object() {
			@Override
			public void finalize() {
				synchronized (LuaState.this) {
					closeInternal();
				}
			}
		};

		// Add metamethods

		for (int i = 0; i < JavaReflector.Metamethod.values().length; i++) {
