package org.eclipse.gymnast.examples.game.lang.gen.ast;

/**
 * A Visitor pattern stub implementation for language Game.
 *
 * @generated by Gymnast from game.ast on Jun 7, 2006 1:11:57 AM
 */
public class GameASTNodeVisitor {

	/**
	 * The external entry point used to perform a visit beginning at the given node.
	 * 
	 * @param node the GameASTNode to visit
	 */
	public final void visit(GameASTNode node) {
		node.accept(this);
	}

	/**
	 * Called just before <code>beginVisit</code> for each node being visited.
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param node the GameASTNode currently being visited
	 */
	public void preVisit(GameASTNode node) {
	}

	/**
	 * Called just after <code>endVisit</code> for each node being visited.
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param node the GameASTNode currently being visited
	 */
	public void postVisit(GameASTNode node) {
	}

	/**
	 * This is called, for each node being visited, just after <code>preVisit</code> and
	 * before (optionally) visiting the children of the node.
	 * This <code>beginVisit</code> method is the generic one called for node types that
	 * don't provide a specific overloaded form of <code>beginVisit</code>.
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param node the GameASTNode currently being visited
	 * @return true to visit the children of the node, false to prevent visiting the children of the node
	 */
	public boolean beginVisit(GameASTNode node) {
		return true;
	}

	/**
	 * This is called, for each node being visited, after <code>beginVisit</code> and
	 * (optionally) visiting the children of the node and before <code>postVisit</code>.
	 * This <code>endVisit</code> method is the generic one called for node types that
	 * don't provide a specific overloaded form of <code>endVisit</code>.
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param node the GameASTNode currently being visited
	 */
	public void endVisit(GameASTNode node) {
	}

	/**
	 * This is called, for each node being visited, just after <code>preVisit</code> and
	 * before (optionally) visiting the children of the node.
	 * This <code>beginVisit</code> method is the specific one called for nodes
	 * of type <code>GameTokenNode</code>
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param tokenNode the node currently being visited
	 * @return true to visit the children of the node, false to prevent visiting the children of the node
	 */
	public boolean beginVisit(GameTokenNode tokenNode) {
		return beginVisit((GameASTNode)tokenNode);
	}

	/**
	 * This is called, for each node being visited, after <code>beginVisit</code> and
	 * (optionally) visiting the children of the node and before <code>postVisit</code>.
	 * This <code>endVisit</code> method is the specific one called for nodes
	 * of type <code>GameTokenNode</code>
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param tokenNode the node currently being visited
	 */
	public void endVisit(GameTokenNode tokenNode) {
		endVisit((GameASTNode)tokenNode);
	}

	/**
	 * This is called, for each node being visited, just after <code>preVisit</code> and
	 * before (optionally) visiting the children of the node.
	 * This <code>beginVisit</code> method is the specific one called for nodes
	 * of type <code>CommandList</code>
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param commandList the node currently being visited
	 * @return true to visit the children of the node, false to prevent visiting the children of the node
	 */
	public boolean beginVisit(CommandList commandList) {
		return beginVisit((GameASTNode)commandList);
	}

	/**
	 * This is called, for each node being visited, after <code>beginVisit</code> and
	 * (optionally) visiting the children of the node and before <code>postVisit</code>.
	 * This <code>endVisit</code> method is the specific one called for nodes
	 * of type <code>CommandList</code>
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param commandList the node currently being visited
	 */
	public void endVisit(CommandList commandList) {
		endVisit((GameASTNode)commandList);
	}
	/**
	 * This is called, for each node being visited, just after <code>preVisit</code> and
	 * before (optionally) visiting the children of the node.
	 * This <code>beginVisit</code> method is the specific one called for nodes
	 * of type <code>Command</code>
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param command the node currently being visited
	 * @return true to visit the children of the node, false to prevent visiting the children of the node
	 */
	public boolean beginVisit(Command command) {
		return beginVisit((GameASTNode)command);
	}

	/**
	 * This is called, for each node being visited, after <code>beginVisit</code> and
	 * (optionally) visiting the children of the node and before <code>postVisit</code>.
	 * This <code>endVisit</code> method is the specific one called for nodes
	 * of type <code>Command</code>
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param command the node currently being visited
	 */
	public void endVisit(Command command) {
		endVisit((GameASTNode)command);
	}
	/**
	 * This is called, for each node being visited, just after <code>preVisit</code> and
	 * before (optionally) visiting the children of the node.
	 * This <code>beginVisit</code> method is the specific one called for nodes
	 * of type <code>OptReps</code>
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param optReps the node currently being visited
	 * @return true to visit the children of the node, false to prevent visiting the children of the node
	 */
	public boolean beginVisit(OptReps optReps) {
		return beginVisit((GameASTNode)optReps);
	}

	/**
	 * This is called, for each node being visited, after <code>beginVisit</code> and
	 * (optionally) visiting the children of the node and before <code>postVisit</code>.
	 * This <code>endVisit</code> method is the specific one called for nodes
	 * of type <code>OptReps</code>
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param optReps the node currently being visited
	 */
	public void endVisit(OptReps optReps) {
		endVisit((GameASTNode)optReps);
	}
	/**
	 * This is called, for each node being visited, just after <code>preVisit</code> and
	 * before (optionally) visiting the children of the node.
	 * This <code>beginVisit</code> method is the specific one called for nodes
	 * of type <code>Shoot</code>
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param shoot the node currently being visited
	 * @return true to visit the children of the node, false to prevent visiting the children of the node
	 */
	public boolean beginVisit(Shoot shoot) {
		return beginVisit((Command)shoot);
	}

	/**
	 * This is called, for each node being visited, after <code>beginVisit</code> and
	 * (optionally) visiting the children of the node and before <code>postVisit</code>.
	 * This <code>endVisit</code> method is the specific one called for nodes
	 * of type <code>Shoot</code>
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param shoot the node currently being visited
	 */
	public void endVisit(Shoot shoot) {
		endVisit((Command)shoot);
	}
	/**
	 * This is called, for each node being visited, just after <code>preVisit</code> and
	 * before (optionally) visiting the children of the node.
	 * This <code>beginVisit</code> method is the specific one called for nodes
	 * of type <code>Move</code>
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param move the node currently being visited
	 * @return true to visit the children of the node, false to prevent visiting the children of the node
	 */
	public boolean beginVisit(Move move) {
		return beginVisit((Command)move);
	}

	/**
	 * This is called, for each node being visited, after <code>beginVisit</code> and
	 * (optionally) visiting the children of the node and before <code>postVisit</code>.
	 * This <code>endVisit</code> method is the specific one called for nodes
	 * of type <code>Move</code>
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param move the node currently being visited
	 */
	public void endVisit(Move move) {
		endVisit((Command)move);
	}
	/**
	 * This is called, for each node being visited, just after <code>preVisit</code> and
	 * before (optionally) visiting the children of the node.
	 * This <code>beginVisit</code> method is the specific one called for nodes
	 * of type <code>Direction</code>
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param direction the node currently being visited
	 * @return true to visit the children of the node, false to prevent visiting the children of the node
	 */
	public boolean beginVisit(Direction direction) {
		return beginVisit((GameTokenNode)direction);
	}

	/**
	 * This is called, for each node being visited, after <code>beginVisit</code> and
	 * (optionally) visiting the children of the node and before <code>postVisit</code>.
	 * This <code>endVisit</code> method is the specific one called for nodes
	 * of type <code>Direction</code>
	 * This may be overridden to provide special behavior at that point in processing.
	 * 
	 * @param direction the node currently being visited
	 */
	public void endVisit(Direction direction) {
		endVisit((GameTokenNode)direction);
	}


}