/* VariableResolverX.java
Purpose:
Description:
History:
Tue Dec 29 13:55:19 TST 2009, Created by tomyeh
Copyright (C) 2009 Potix Corporation. All Rights Reserved.
*/
package org.zkoss.xel;
/**
* An extension of {@link VariableResolver} to have more control to
* resolve the variables.
* <p>With {@link VariableResolver}, {@link VariableResolver#resolveVariable}
* is called to resolve a top-level variable (for example, <code>${a.b.c}</code>
* where <code>a</code> is a top-level variable).
* <p>With {@link VariableResolverX}, {@link #resolveVariable(XelContext, Object, Object)}
* is called to resolve not only top-level variables but also properties
* (for example, <code>${a.b.c}</code> where <code>b</code> and <code>c</code>
* are properties).
* <p>If {@link VariableResolverX} is implemented, {@link VariableResolver#resolveVariable}
* is ignored. In other words, EL evaluator always invoke
* {@link #resolveVariable(XelContext, Object, Object)}.
* <p>Notice you have to follow the same rule to invoke the <code>resolveVariable</code> method.
* And there is a method called {@link org.zkoss.xel.util.Evaluators#resolveVariable}
* that can be used to do the job.
* @author tomyeh
* @since 5.0.0
*/
public interface VariableResolverX extends VariableResolver {
/** Resolves the the given variable on the given base object.
*
* <p>It resolves not only top-level variables but also properties.
* For example, when resolving <code>foo.duke</code>,
* <code>resolveVariable(ctx, null, "foo")</code> is called first.
* And if it returns an non-null object,
* <code>resolveVariable(ctx, foo, "duke"),/code> is called then
* (where we assume the returned object in the previous call is <code>foo</code>).
*
* @param ctx the context of this evaluation
* @param base the base object whose property value is to be returned,
* or null to resolve a top-level variable.
* @param name the name of the variable (or property) to resolve
*/
public Object resolveVariable(XelContext ctx, Object base, Object name)
throws XelException;
}