import edu.neu.ccs.demeter.*;
class CopyVisitor extends UniversalVisitor {
  public CopyVisitor() {
    super();
  }

    private java.util.Stack history = new java.util.Stack();
    public CopyVisitor(Class firstClass) {
      try {
        history.push(firstClass.newInstance());
      } catch(Exception e) {
        e.printStackTrace();
      }
    }
  
  public Object get_copy() { return history.peek(); }
  Object get_return_val() { return get_copy() ; }
  public void before_traversalaspect_list(DAJ source, TraversalAspect_List dest) {
    DAJ it = (DAJ) history.peek();
    TraversalAspect_List p = new TraversalAspect_List();
    it.set_traversalaspect_list(p);
    history.push(p);
  }
  public void after_traversalaspect_list(DAJ source, TraversalAspect_List dest) {
    history.pop();
  }
  public void before_aspectname(TraversalAspect source, AspectName dest) {
    TraversalAspect it = (TraversalAspect) history.peek();
    AspectName p = new AspectName();
    it.set_aspectname(p);
    history.push(p);
  }
  public void after_aspectname(TraversalAspect source, AspectName dest) {
    history.pop();
  }
  public void before_decls(TraversalAspect source, Definition_CurlyList dest) {
    TraversalAspect it = (TraversalAspect) history.peek();
    Definition_CurlyList p = new Definition_CurlyList();
    it.set_decls(p);
    history.push(p);
  }
  public void after_decls(TraversalAspect source, Definition_CurlyList dest) {
    history.pop();
  }
  public void before_definitionbody(Definition source, DefinitionBody dest) {
    Definition it = (Definition) history.peek();
    Class c = dest.getClass();
    Object p = null;
    try {
      p = c.newInstance();
    } catch(Exception e) {
      e.printStackTrace();
    }
    it.set_definitionbody((DefinitionBody) p);
    history.push(p);
  }
  public void after_definitionbody(Definition source, DefinitionBody dest) {
    history.pop();
  }
  public void before_classgraphname(CG source, ClassGraphName dest) {
    CG it = (CG) history.peek();
    ClassGraphName p = new ClassGraphName();
    it.set_classgraphname(p);
    history.push(p);
  }
  public void after_classgraphname(CG source, ClassGraphName dest) {
    history.pop();
  }
  public void before_strategyname(Strategy source, StrategyName dest) {
    Strategy it = (Strategy) history.peek();
    StrategyName p = new StrategyName();
    it.set_strategyname(p);
    history.push(p);
  }
  public void after_strategyname(Strategy source, StrategyName dest) {
    history.pop();
  }
  public void before_strategyexpression(Strategy source, StrategyExpression dest) {
    Strategy it = (Strategy) history.peek();
    Class c = dest.getClass();
    Object p = null;
    try {
      p = c.newInstance();
    } catch(Exception e) {
      e.printStackTrace();
    }
    it.set_strategyexpression((StrategyExpression) p);
    history.push(p);
  }
  public void after_strategyexpression(Strategy source, StrategyExpression dest) {
    history.pop();
  }
  public void before_string(StrategyString source, String dest) {
    StrategyString it = (StrategyString) history.peek();
    it.set_string(dest);
  }
  public void before_op(Compound source, Op dest) {
    Compound it = (Compound) history.peek();
    Class c = dest.getClass();
    Object p = null;
    try {
      p = c.newInstance();
    } catch(Exception e) {
      e.printStackTrace();
    }
    it.set_op((Op) p);
    history.push(p);
  }
  public void after_op(Compound source, Op dest) {
    history.pop();
  }
  public void before_strategyexpression_list(Compound source, StrategyExpression_List dest) {
    Compound it = (Compound) history.peek();
    StrategyExpression_List p = new StrategyExpression_List();
    it.set_strategyexpression_list(p);
    history.push(p);
  }
  public void after_strategyexpression_list(Compound source, StrategyExpression_List dest) {
    history.pop();
  }
  public void before_methodsignature(AdaptiveMethod source, MethodSignature dest) {
    AdaptiveMethod it = (AdaptiveMethod) history.peek();
    MethodSignature p = new MethodSignature();
    it.set_methodsignature(p);
    history.push(p);
  }
  public void after_methodsignature(AdaptiveMethod source, MethodSignature dest) {
    history.pop();
  }
  public void before_methodbody(AdaptiveMethod source, MethodBody dest) {
    AdaptiveMethod it = (AdaptiveMethod) history.peek();
    MethodBody p = new MethodBody();
    it.set_methodbody(p);
    history.push(p);
  }
  public void after_methodbody(AdaptiveMethod source, MethodBody dest) {
    history.pop();
  }
  public void before_keywords(MethodSignature source, MethodKeyword_List dest) {
    MethodSignature it = (MethodSignature) history.peek();
    MethodKeyword_List p = new MethodKeyword_List();
    it.set_keywords(p);
    history.push(p);
  }
  public void after_keywords(MethodSignature source, MethodKeyword_List dest) {
    history.pop();
  }
  public void before_returnType(MethodSignature source, JavaType dest) {
    MethodSignature it = (MethodSignature) history.peek();
    JavaType p = new JavaType();
    it.set_returnType(p);
    history.push(p);
  }
  public void after_returnType(MethodSignature source, JavaType dest) {
    history.pop();
  }
  public void before_name(MethodSignature source, MethodName dest) {
    MethodSignature it = (MethodSignature) history.peek();
    MethodName p = new MethodName();
    it.set_name(p);
    history.push(p);
  }
  public void after_name(MethodSignature source, MethodName dest) {
    history.pop();
  }
  public void before_parms(MethodSignature source, MethodParm_Commalist dest) {
    MethodSignature it = (MethodSignature) history.peek();
    MethodParm_Commalist p = new MethodParm_Commalist();
    it.set_parms(p);
    history.push(p);
  }
  public void after_parms(MethodSignature source, MethodParm_Commalist dest) {
    history.pop();
  }
  public void before_throwsclause(MethodSignature source, Throws dest) {
    MethodSignature it = (MethodSignature) history.peek();
    Throws p = new Throws();
    it.set_throwsclause(p);
    history.push(p);
  }
  public void after_throwsclause(MethodSignature source, Throws dest) {
    history.pop();
  }
  public void before_type(MethodParm source, JavaType dest) {
    MethodParm it = (MethodParm) history.peek();
    JavaType p = new JavaType();
    it.set_type(p);
    history.push(p);
  }
  public void after_type(MethodParm source, JavaType dest) {
    history.pop();
  }
  public void before_name(MethodParm source, ParmName dest) {
    MethodParm it = (MethodParm) history.peek();
    ParmName p = new ParmName();
    it.set_name(p);
    history.push(p);
  }
  public void after_name(MethodParm source, ParmName dest) {
    history.pop();
  }
  public void before_array(MethodParm source, ArraySpec_List dest) {
    MethodParm it = (MethodParm) history.peek();
    ArraySpec_List p = new ArraySpec_List();
    it.set_array(p);
    history.push(p);
  }
  public void after_array(MethodParm source, ArraySpec_List dest) {
    history.pop();
  }
  public void before_exceptions(Throws source, ClassName_Commalist dest) {
    Throws it = (Throws) history.peek();
    ClassName_Commalist p = new ClassName_Commalist();
    it.set_exceptions(p);
    history.push(p);
  }
  public void after_exceptions(Throws source, ClassName_Commalist dest) {
    history.pop();
  }
  public void before_trv(MethodBody source, StrategyExpression dest) {
    MethodBody it = (MethodBody) history.peek();
    Class c = dest.getClass();
    Object p = null;
    try {
      p = c.newInstance();
    } catch(Exception e) {
      e.printStackTrace();
    }
    it.set_trv((StrategyExpression) p);
    history.push(p);
  }
  public void after_trv(MethodBody source, StrategyExpression dest) {
    history.pop();
  }
  public void before_vis(MethodBody source, VisitorRef dest) {
    MethodBody it = (MethodBody) history.peek();
    VisitorRef p = new VisitorRef();
    it.set_vis(p);
    history.push(p);
  }
  public void after_vis(MethodBody source, VisitorRef dest) {
    history.pop();
  }
  public void before_visitorClasses(VisitorRef source, ClassName_Commalist dest) {
    VisitorRef it = (VisitorRef) history.peek();
    ClassName_Commalist p = new ClassName_Commalist();
    it.set_visitorClasses(p);
    history.push(p);
  }
  public void after_visitorClasses(VisitorRef source, ClassName_Commalist dest) {
    history.pop();
  }
  public void before_type(JavaType source, Name dest) {
    JavaType it = (JavaType) history.peek();
    Name p = new Name();
    it.set_type(p);
    history.push(p);
  }
  public void after_type(JavaType source, Name dest) {
    history.pop();
  }
  public void before_array(JavaType source, ArraySpec_List dest) {
    JavaType it = (JavaType) history.peek();
    ArraySpec_List p = new ArraySpec_List();
    it.set_array(p);
    history.push(p);
  }
  public void after_array(JavaType source, ArraySpec_List dest) {
    history.pop();
  }
  public void before_first(Name source, Nonempty_Name dest) {
    Name it = (Name) history.peek();
    Nonempty_Name p = new Nonempty_Name();
    it.set_first(p);
    history.push(p);
  }
  public void after_first(Name source, Nonempty_Name dest) {
    history.pop();
  }
  public void before_ident(ClassGraphName source, Ident dest) {
    ClassGraphName it = (ClassGraphName) history.peek();
    it.set_ident(dest);
  }
  public void before_ident(StrategyName source, Ident dest) {
    StrategyName it = (StrategyName) history.peek();
    it.set_ident(dest);
  }
  public void before_ident(MethodName source, Ident dest) {
    MethodName it = (MethodName) history.peek();
    it.set_ident(dest);
  }
  public void before_name(ClassName source, Name dest) {
    ClassName it = (ClassName) history.peek();
    Name p = new Name();
    it.set_name(p);
    history.push(p);
  }
  public void after_name(ClassName source, Name dest) {
    history.pop();
  }
  public void before_name(ParmName source, Ident dest) {
    ParmName it = (ParmName) history.peek();
    it.set_name(dest);
  }
  public void before_name(AspectName source, Name dest) {
    AspectName it = (AspectName) history.peek();
    Name p = new Name();
    it.set_name(p);
    history.push(p);
  }
  public void after_name(AspectName source, Name dest) {
    history.pop();
  }
  public void before_s(Main source, String dest) {
    Main it = (Main) history.peek();
    it.set_s(dest);
  }
  public void before_indent(PrintVisitor source, int dest) {
    PrintVisitor it = (PrintVisitor) history.peek();
    it.set_indent(dest);
  }
  public void before_needSpace(PrintVisitor source, boolean dest) {
    PrintVisitor it = (PrintVisitor) history.peek();
    it.set_needSpace(dest);
  }
  public void before_is_equal(SubgraphVisitor source, boolean dest) {
    SubgraphVisitor it = (SubgraphVisitor) history.peek();
    it.set_is_equal(dest);
  }
  public void before_is_equal(EqualVisitor source, boolean dest) {
    EqualVisitor it = (EqualVisitor) history.peek();
    it.set_is_equal(dest);
  }
  public void before_indent(DisplayVisitor source, int dest) {
    DisplayVisitor it = (DisplayVisitor) history.peek();
    it.set_indent(dest);
  }
  public void before_indent(TraceVisitor source, int dest) {
    TraceVisitor it = (TraceVisitor) history.peek();
    it.set_indent(dest);
  }
  public void before_first(TraversalAspect_List source, Nonempty_TraversalAspect_List dest) {
    TraversalAspect_List it = (TraversalAspect_List) history.peek();
    Nonempty_TraversalAspect_List p = new Nonempty_TraversalAspect_List();
    it.set_first(p);
    history.push(p);
  }
  public void after_first(TraversalAspect_List source, Nonempty_TraversalAspect_List dest) {
    history.pop();
  }
  public void before_first(Definition_CurlyList source, Nonempty_Definition_CurlyList dest) {
    Definition_CurlyList it = (Definition_CurlyList) history.peek();
    Nonempty_Definition_CurlyList p = new Nonempty_Definition_CurlyList();
    it.set_first(p);
    history.push(p);
  }
  public void after_first(Definition_CurlyList source, Nonempty_Definition_CurlyList dest) {
    history.pop();
  }
  public void before_first(StrategyExpression_List source, Nonempty_StrategyExpression_List dest) {
    StrategyExpression_List it = (StrategyExpression_List) history.peek();
    Nonempty_StrategyExpression_List p = new Nonempty_StrategyExpression_List();
    it.set_first(p);
    history.push(p);
  }
  public void after_first(StrategyExpression_List source, Nonempty_StrategyExpression_List dest) {
    history.pop();
  }
  public void before_first(MethodKeyword_List source, Nonempty_MethodKeyword_List dest) {
    MethodKeyword_List it = (MethodKeyword_List) history.peek();
    Nonempty_MethodKeyword_List p = new Nonempty_MethodKeyword_List();
    it.set_first(p);
    history.push(p);
  }
  public void after_first(MethodKeyword_List source, Nonempty_MethodKeyword_List dest) {
    history.pop();
  }
  public void before_first(MethodParm_Commalist source, Nonempty_MethodParm_Commalist dest) {
    MethodParm_Commalist it = (MethodParm_Commalist) history.peek();
    Nonempty_MethodParm_Commalist p = new Nonempty_MethodParm_Commalist();
    it.set_first(p);
    history.push(p);
  }
  public void after_first(MethodParm_Commalist source, Nonempty_MethodParm_Commalist dest) {
    history.pop();
  }
  public void before_first(ArraySpec_List source, Nonempty_ArraySpec_List dest) {
    ArraySpec_List it = (ArraySpec_List) history.peek();
    Nonempty_ArraySpec_List p = new Nonempty_ArraySpec_List();
    it.set_first(p);
    history.push(p);
  }
  public void after_first(ArraySpec_List source, Nonempty_ArraySpec_List dest) {
    history.pop();
  }
  public void before_first(ClassName_Commalist source, Nonempty_ClassName_Commalist dest) {
    ClassName_Commalist it = (ClassName_Commalist) history.peek();
    Nonempty_ClassName_Commalist p = new Nonempty_ClassName_Commalist();
    it.set_first(p);
    history.push(p);
  }
  public void after_first(ClassName_Commalist source, Nonempty_ClassName_Commalist dest) {
    history.pop();
  }
  public void before_it(Nonempty_Name source, Ident dest) {
    Nonempty_Name it = (Nonempty_Name) history.peek();
    it.set_it(dest);
  }
  public void before_next(Nonempty_Name source, Nonempty_Name dest) {
    Nonempty_Name it = (Nonempty_Name) history.peek();
    Nonempty_Name p = new Nonempty_Name();
    it.set_next(p);
    history.push(p);
  }
  public void after_next(Nonempty_Name source, Nonempty_Name dest) {
    history.pop();
  }
  public void before_it(Nonempty_TraversalAspect_List source, TraversalAspect dest) {
    Nonempty_TraversalAspect_List it = (Nonempty_TraversalAspect_List) history.peek();
    TraversalAspect p = new TraversalAspect();
    it.set_it(p);
    history.push(p);
  }
  public void after_it(Nonempty_TraversalAspect_List source, TraversalAspect dest) {
    history.pop();
  }
  public void before_next(Nonempty_TraversalAspect_List source, Nonempty_TraversalAspect_List dest) {
    Nonempty_TraversalAspect_List it = (Nonempty_TraversalAspect_List) history.peek();
    Nonempty_TraversalAspect_List p = new Nonempty_TraversalAspect_List();
    it.set_next(p);
    history.push(p);
  }
  public void after_next(Nonempty_TraversalAspect_List source, Nonempty_TraversalAspect_List dest) {
    history.pop();
  }
  public void before_it(Nonempty_Definition_CurlyList source, Definition dest) {
    Nonempty_Definition_CurlyList it = (Nonempty_Definition_CurlyList) history.peek();
    Definition p = new Definition();
    it.set_it(p);
    history.push(p);
  }
  public void after_it(Nonempty_Definition_CurlyList source, Definition dest) {
    history.pop();
  }
  public void before_next(Nonempty_Definition_CurlyList source, Nonempty_Definition_CurlyList dest) {
    Nonempty_Definition_CurlyList it = (Nonempty_Definition_CurlyList) history.peek();
    Nonempty_Definition_CurlyList p = new Nonempty_Definition_CurlyList();
    it.set_next(p);
    history.push(p);
  }
  public void after_next(Nonempty_Definition_CurlyList source, Nonempty_Definition_CurlyList dest) {
    history.pop();
  }
  public void before_it(Nonempty_StrategyExpression_List source, StrategyExpression dest) {
    Nonempty_StrategyExpression_List it = (Nonempty_StrategyExpression_List) history.peek();
    Class c = dest.getClass();
    Object p = null;
    try {
      p = c.newInstance();
    } catch(Exception e) {
      e.printStackTrace();
    }
    it.set_it((StrategyExpression) p);
    history.push(p);
  }
  public void after_it(Nonempty_StrategyExpression_List source, StrategyExpression dest) {
    history.pop();
  }
  public void before_next(Nonempty_StrategyExpression_List source, Nonempty_StrategyExpression_List dest) {
    Nonempty_StrategyExpression_List it = (Nonempty_StrategyExpression_List) history.peek();
    Nonempty_StrategyExpression_List p = new Nonempty_StrategyExpression_List();
    it.set_next(p);
    history.push(p);
  }
  public void after_next(Nonempty_StrategyExpression_List source, Nonempty_StrategyExpression_List dest) {
    history.pop();
  }
  public void before_it(Nonempty_MethodKeyword_List source, MethodKeyword dest) {
    Nonempty_MethodKeyword_List it = (Nonempty_MethodKeyword_List) history.peek();
    Class c = dest.getClass();
    Object p = null;
    try {
      p = c.newInstance();
    } catch(Exception e) {
      e.printStackTrace();
    }
    it.set_it((MethodKeyword) p);
    history.push(p);
  }
  public void after_it(Nonempty_MethodKeyword_List source, MethodKeyword dest) {
    history.pop();
  }
  public void before_next(Nonempty_MethodKeyword_List source, Nonempty_MethodKeyword_List dest) {
    Nonempty_MethodKeyword_List it = (Nonempty_MethodKeyword_List) history.peek();
    Nonempty_MethodKeyword_List p = new Nonempty_MethodKeyword_List();
    it.set_next(p);
    history.push(p);
  }
  public void after_next(Nonempty_MethodKeyword_List source, Nonempty_MethodKeyword_List dest) {
    history.pop();
  }
  public void before_it(Nonempty_MethodParm_Commalist source, MethodParm dest) {
    Nonempty_MethodParm_Commalist it = (Nonempty_MethodParm_Commalist) history.peek();
    MethodParm p = new MethodParm();
    it.set_it(p);
    history.push(p);
  }
  public void after_it(Nonempty_MethodParm_Commalist source, MethodParm dest) {
    history.pop();
  }
  public void before_next(Nonempty_MethodParm_Commalist source, Nonempty_MethodParm_Commalist dest) {
    Nonempty_MethodParm_Commalist it = (Nonempty_MethodParm_Commalist) history.peek();
    Nonempty_MethodParm_Commalist p = new Nonempty_MethodParm_Commalist();
    it.set_next(p);
    history.push(p);
  }
  public void after_next(Nonempty_MethodParm_Commalist source, Nonempty_MethodParm_Commalist dest) {
    history.pop();
  }
  public void before_it(Nonempty_ArraySpec_List source, ArraySpec dest) {
    Nonempty_ArraySpec_List it = (Nonempty_ArraySpec_List) history.peek();
    ArraySpec p = new ArraySpec();
    it.set_it(p);
    history.push(p);
  }
  public void after_it(Nonempty_ArraySpec_List source, ArraySpec dest) {
    history.pop();
  }
  public void before_next(Nonempty_ArraySpec_List source, Nonempty_ArraySpec_List dest) {
    Nonempty_ArraySpec_List it = (Nonempty_ArraySpec_List) history.peek();
    Nonempty_ArraySpec_List p = new Nonempty_ArraySpec_List();
    it.set_next(p);
    history.push(p);
  }
  public void after_next(Nonempty_ArraySpec_List source, Nonempty_ArraySpec_List dest) {
    history.pop();
  }
  public void before_it(Nonempty_ClassName_Commalist source, ClassName dest) {
    Nonempty_ClassName_Commalist it = (Nonempty_ClassName_Commalist) history.peek();
    ClassName p = new ClassName();
    it.set_it(p);
    history.push(p);
  }
  public void after_it(Nonempty_ClassName_Commalist source, ClassName dest) {
    history.pop();
  }
  public void before_next(Nonempty_ClassName_Commalist source, Nonempty_ClassName_Commalist dest) {
    Nonempty_ClassName_Commalist it = (Nonempty_ClassName_Commalist) history.peek();
    Nonempty_ClassName_Commalist p = new Nonempty_ClassName_Commalist();
    it.set_next(p);
    history.push(p);
  }
  public void after_next(Nonempty_ClassName_Commalist source, Nonempty_ClassName_Commalist dest) {
    history.pop();
  }
  void universal_trv0_bef(UniversalVisitor _v_) {
    super.universal_trv0_bef(_v_);
  }

  void universal_trv0_aft(UniversalVisitor _v_) {
    super.universal_trv0_aft(_v_);
  }

  void universal_trv0(UniversalVisitor _v_) {
    universal_trv0_bef(_v_);
    Object copy = get_copy();
    super.universal_trv0(_v_);
    universal_trv0_aft(_v_);
  }

}

