import demeter.*;
class CopyVisitor extends UniversalVisitor implements Cloneable {
  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();
      }
    }
    Object get_copy() {
    return history.peek();
  }
  public void before_personname(Person source, Ident dest) {
    Person it = (Person) history.peek();
    it.set_personname(dest);
  }
  public void before_spouse(Person source, Person dest) {
    Person it = (Person) history.peek();
    Person p = new Person();
    it.set_spouse(p);
    history.push(p);
  }
  public void after_spouse(Person source, Person dest) {
    history.pop();
  }
  public void before_siblings(Person source, Person_NList dest) {
    Person it = (Person) history.peek();
    Person_NList p = new Person_NList();
    it.set_siblings(p);
    history.push(p);
  }
  public void after_siblings(Person source, Person_NList dest) {
    history.pop();
  }
  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(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(Person_NList source, Nonempty_Person_NList dest) {
    Person_NList it = (Person_NList) history.peek();
    Nonempty_Person_NList p = new Nonempty_Person_NList();
    it.set_first(p);
    history.push(p);
  }
  public void after_first(Person_NList source, Nonempty_Person_NList dest) {
    history.pop();
  }
  public void before_it(Nonempty_Person_NList source, Person dest) {
    Nonempty_Person_NList it = (Nonempty_Person_NList) history.peek();
    Person p = new Person();
    it.set_it(p);
    history.push(p);
  }
  public void after_it(Nonempty_Person_NList source, Person dest) {
    history.pop();
  }
  public void before_next(Nonempty_Person_NList source, Nonempty_Person_NList dest) {
    Nonempty_Person_NList it = (Nonempty_Person_NList) history.peek();
    Nonempty_Person_NList p = new Nonempty_Person_NList();
    it.set_next(p);
    history.push(p);
  }
  public void after_next(Nonempty_Person_NList source, Nonempty_Person_NList 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_);
  }
}

