/* ExpressionFactory.java

	Purpose:
		
	Description:
		
	History:
		Thu Aug 30 10:29:09     2007, Created by tomyeh

Copyright (C) 2007 Potix Corporation. All Rights Reserved.

{{IS_RIGHT
	This program is distributed under LGPL Version 2.1 in the hope that
	it will be useful, but WITHOUT ANY WARRANTY.
}}IS_RIGHT
*/
package org.zkoss.xel;

/**
 * Used to prepare expressions ({@link Expression}).
 *
 * @author tomyeh
 * @since 3.0.0
 */
public interface ExpressionFactory {
	/** Used with {@link #isSupported} to know whether the factory
	 * supports {@link FunctionMapper#resolveFunction}
	 */
	public static final int FEATURE_FUNCTION = 0x0001;
	/** Used with {@link #isSupported} to know whether the factory
	 * supports {@link FunctionMapperExt#resolveClass}
	 */
	public static final int FEATURE_CLASS = 0x0002;
	/** Returns whether an feature is supported.
	 *
	 * @param feature which feature to query.
	 * It can be a combination of {@link #FEATURE_FUNCTION}
	 * and {@link #FEATURE_CLASS}.
	 */
	public boolean isSupported(int feature);

	/** Prepares (a.k.a., compiles) an expression.
	 *
     * @param ctx the context information to prepare the expression.
     * It can be null, in which case no functions are supported for this
     * invocation.
	 * @param expression the expression to be evaluated.
	 * @param expectedType the expected type of the result of the evaluation
	 */
	public Expression parseExpression(XelContext ctx, String expression,
	Class<?> expectedType)
	throws XelException;
	/** Evaluates an expression.
	 *
	 * @param ctx the context information to evaluate an expression.
     * It can be null, in which case no functions are supported for this
     * invocation.
	 * @param expression the expression to be evaluated.
	 * Note: the expression is enclosed
	 * with ${ and }, regardless of what implementation is used.
	 * @param expectedType the expected type of the result of the evaluation
	 */
	public Object evaluate(XelContext ctx, String expression,
	Class<?> expectedType)
	throws XelException;
}
