// Path: src/main/java/org/dynaform/xml/form/Form.java
// public interface Form {
//   
//   String HL_CHILD = "/";
//   String HL_DESCENDANT_OR_SELF = "//";
//   String LL_CHILD = "!";
//   String LL_DESCENDANT_OR_SELF = "!!";
//   String INDEX_START = "[";
//   String INDEX_END = "]";
//   String OPERATOR_SEQUENCE = "sequence";
//   String OPERATOR_CHOICE = "choice";
//   String OPERATOR_ALL = "all";
//   
//   // Identity and parent
//   String getDescendantOrSelfSelector();         // "//element"
//   String getFullSelector();                     // "/aa/bb/cc!selector[0]"
//   String getHighLevelFullSelectorForChildren(); // "/aa/bb/cc"
// 
//   String getHighLevelId();  // cc
//   String getLowLevelId();   // selector[0]
//   
//   Form getParent();
//   void _setParent(Form parent);
//   
//   // Sequence
//   String nextCounterValue();
//   
//   // Visitors
// 	void accept(FormVisitor visitor);
// 	<T> T apply(FormFunction<T> function);
// 
// }
// 
// Path: src/main/java/org/dynaform/xml/reader/XmlReader.java
// public interface XmlReader {
// 
//   /**
//    * Creates XML event handler for consuming the XML.
//    * 
//    * @param next next XML reader.
//    * @return XML event handler.
//    */
//   XmlVisitor create(XmlReader next);
//   
// }


import org.dynaform.xml.form.Form;
import org.dynaform.xml.reader.XmlReader;
import org.dynaform.xml.writer.XmlWriter;

package org.dynaform.xml;



public class XmlFormImpl implements XmlForm {

	private final Form form;
	private final XmlWriter writer;
	private final XmlReader reader;
	
	public XmlFormImpl(Form form, XmlWriter writer) {
	  this(form, writer, null);
	}

	public XmlFormImpl(Form form, XmlWriter writer, XmlReader reader) {
	  this.form = form;
	  this.writer = writer;
	  this.reader = reader;
	}
	
	public Form getForm() {
		return form;
	}

	public XmlWriter getWriter() {
		return writer;
	}
	

// Path: src/main/java/org/dynaform/xml/form/Form.java
// public interface Form {
//   
//   String HL_CHILD = "/";
//   String HL_DESCENDANT_OR_SELF = "//";
//   String LL_CHILD = "!";
//   String LL_DESCENDANT_OR_SELF = "!!";
//   String INDEX_START = "[";
//   String INDEX_END = "]";
//   String OPERATOR_SEQUENCE = "sequence";
//   String OPERATOR_CHOICE = "choice";
//   String OPERATOR_ALL = "all";
//   
//   // Identity and parent
//   String getDescendantOrSelfSelector();         // "//element"
//   String getFullSelector();                     // "/aa/bb/cc!selector[0]"
//   String getHighLevelFullSelectorForChildren(); // "/aa/bb/cc"
// 
//   String getHighLevelId();  // cc
//   String getLowLevelId();   // selector[0]
//   
//   Form getParent();
//   void _setParent(Form parent);
//   
//   // Sequence
//   String nextCounterValue();
//   
//   // Visitors
// 	void accept(FormVisitor visitor);
// 	<T> T apply(FormFunction<T> function);
// 
// }
// 
// Path: src/main/java/org/dynaform/xml/reader/XmlReader.java
// public interface XmlReader {
// 
//   /**
//    * Creates XML event handler for consuming the XML.
//    * 
//    * @param next next XML reader.
//    * @return XML event handler.
//    */
//   XmlVisitor create(XmlReader next);
//   
// }


// Path: src/main/java/org/dynaform/xml/XmlFormImpl.java
import org.dynaform.xml.form.Form;
import org.dynaform.xml.reader.XmlReader;
import org.dynaform.xml.writer.XmlWriter;

package org.dynaform.xml;



public class XmlFormImpl implements XmlForm {

	private final Form form;
	private final XmlWriter writer;
	private final XmlReader reader;
	
	public XmlFormImpl(Form form, XmlWriter writer) {
	  this(form, writer, null);
	}

	public XmlFormImpl(Form form, XmlWriter writer, XmlReader reader) {
	  this.form = form;
	  this.writer = writer;
	  this.reader = reader;
	}
	
	public Form getForm() {
		return form;
	}

	public XmlWriter getWriter() {
		return writer;
	}
	

	public XmlReader getReader() {
