/*
 * $Id: Converter.java 38 2012-01-04 22:44:15Z andre@naef.com $
 * See LICENSE.txt for license terms.
 */

package com.naef.jnlua;

/**
 * Converts between Lua values and Java objects.
 */
public interface Converter {
	/**
	 * Returns the type distance between a Lua value and a formal Java type.
	 * Distances are comparable for the same Lua value only. If a Lua value
	 * cannot be converted to the specified formal type, the method returns
	 * <code>Integer.MAX_VALUE</code>.
	 * 
	 * @param luaState
	 *            the Lua state
	 * @param index
	 *            the stack index containing the value
	 * @param formalType
	 *            the formal Java type
	 * @return the type distance, or <code>Integer.MAX_VALUE</code> if the
	 *         conversion is not supported
	 */
	public int getTypeDistance(LuaState luaState, int index, Class<?> formalType);

	/**
	 * Converts a Lua value to a Java object of the specified formal type.
	 * 
	 * <p>
	 * If the Lua value is <code>nil</code>, the method returns
	 * <code>null</code>.
	 * </p>
	 * 
	 * @param luaState
	 *            the Lua state
	 * @param index
	 *            the stack index containing the value
	 * @return the Java object, or <code>null</code>
	 * @param formalType
	 *            the formal Java type
	 * @throws ClassCastException
	 *             if the conversion is not possible
	 */
	public <T> T convertLuaValue(LuaState luaState, int index,
			Class<T> formalType);

	/**
	 * Converts a Java object to a Lua value and pushes that value on the stack.
	 * 
	 * <p>
	 * If the object is <code>null</code>, the method pushes <code>nil</code>.
	 * </p>
	 * 
	 * @param luaState
	 *            the Lua state
	 * @param object
	 *            the Java object, or <code>null</code>
	 */
	public void convertJavaObject(LuaState luaState, Object object);
}
