public void render (RequestEvaluator reval, ESNode thisNode) {
public void render (RequestEvaluator reval, ESNode thisNode, ESObject paramObject) {
	public void render (RequestEvaluator reval, ESNode thisNode) {	    if ("response".equalsIgnoreCase (handler)) {	        renderFromResponse (reval);	        return;	    }	    try {	        ESObject handlerObject = null;	        ESValue[] arguments = new ESValue[1];	        ESRequestData par =  new ESRequestData (reval);	        par.setData (parameters);	        arguments[0] = par;	        if (handler != null) {	            // not a global macro - need to find handler object	            if (thisNode != null) {	                // was called with this object - check it or its parents for matching prototype	                if (!handler.equalsIgnoreCase ("this") && !handler.equalsIgnoreCase (thisNode.getPrototypeName ())) {	                    // the handler object is not what we want	                    INode n = thisNode.getNode();	                    // walk down parent chain to find handler object	                    while (n != null) {	                        if (handler.equalsIgnoreCase (n.getPrototype())) {	                            handlerObject = reval.getNodeWrapper (n);	                            break;	                        }	                        n = n.getParent ();	                    }	                } else {	                    // we already have the right handler object	                    handlerObject = thisNode;	                }	            }	            if (handlerObject == null) {	                // eiter because thisNode == null or the right object wasn't found in the targetNode path	                // go check request path for an object with matching prototype	                int l = reval.reqPath.size();	                for (int i=l-1; i>=0; i--) {	                    if (handler.equalsIgnoreCase (((ESNode) reval.reqPath.getProperty(i)).getPrototypeName())) {	                         handlerObject = (ESNode) reval.reqPath.getProperty(i);	                         break;	                    }	                }	            }	        } else {	            // this is a global macro with no handler specified	            handlerObject = reval.global;	        }	        if (handlerObject != null) {	            ESValue v = handlerObject.doIndirectCall (reval.evaluator, handlerObject, name+"_macro", arguments);	            if (v != ESUndefined.theUndefined && v != ESNull.theNull)	                reval.res.write (v);	        } else {	            String msg = "[HopMacro unhandled: "+handler+"."+name+"]";	            reval.res.write (" "+msg+" ");	            IServer.getLogger().log (msg);	        }	    } catch (Exception x) {	        String msg = "[HopMacro error: "+x+"]";	        reval.res.write (" "+msg+" ");	        IServer.getLogger().log (msg);	    }	}