// $Id: WithCurrentExpr.java 96 2005-02-28 21:07:29Z blindsey $

package com.jclark.xsl.expr;

import com.jclark.xsl.om.*;

class WithCurrentExpr extends ConvertibleExpr 
{
    private final ConvertibleExpr expr;

    class Context extends DelegateExprContext 
    {
        Node node;

        Context(Node node, ExprContext context) {
            super(context);
            this.node = node;
        }

        public Node getCurrent(Node contextNode) {
            return node;
        }
    }

    WithCurrentExpr(ConvertibleExpr expr) 
    {
        this.expr = expr;
    }

    ConvertibleStringExpr makeStringExpr() 
    {
        final StringExpr e = expr.makeStringExpr();
        return new ConvertibleStringExpr() {
                public String eval(Node node, ExprContext context) throws XSLException {
                    return e.eval(node, new Context(node, context));
                }
                public String constantValue() {
                    return e.constantValue();
                }
            };
    }

    ConvertibleVariantExpr makeVariantExpr() {
        final VariantExpr e = expr.makeVariantExpr();
        return new ConvertibleVariantExpr() {
                public Variant eval(Node node, ExprContext context) throws XSLException {
                    return e.eval(node, new Context(node, context));
                }
            };
    }

    ConvertibleNodeSetExpr makeNodeSetExpr() throws ParseException {
        final NodeSetExpr e = expr.makeNodeSetExpr();
        return new ConvertibleNodeSetExpr() {
                public NodeIterator eval(Node node, ExprContext context) throws XSLException {
                    return e.eval(node, new Context(node, context));
                }
            };
    }

    ConvertibleNumberExpr makeNumberExpr() {
        final NumberExpr e = expr.makeNumberExpr();
        return new ConvertibleNumberExpr() {
                public double eval(Node node, ExprContext context) throws XSLException {
                    return e.eval(node, new Context(node, context));
                }
            };
    }

    ConvertibleBooleanExpr makeBooleanExpr() {
        final BooleanExpr e = expr.makeBooleanExpr();
        return new ConvertibleBooleanExpr() {
                public boolean eval(Node node, ExprContext context) throws XSLException {
                    return e.eval(node, new Context(node, context));
                }
            };
    }
}
