/**
  * Writes the object-graph containing values (primitives and wrappers), objects, and arrays,
  * starting from the given <code>o</code> node.
  *
  * @param o the write start-point node
  * @throws IllegalArgumentException if an illegal (non values/bean/array) is encountered
  */
 public final void write(Object o) {
   this.ensureRootWritten();
   try {
     this.write0(o);
   } catch (NoSuchMethodException nDC) {
     throw new IllegalArgumentException("o: no default constructor: " + nDC.getMessage(), nDC);
   } catch (InvocationTargetException | InstantiationException iDC) {
     throw new IllegalArgumentException(
         "o: invalid default constructor: " + iDC.getMessage(), iDC);
   } catch (IllegalAccessException iDCM) {
     throw new IllegalArgumentException(
         "o: invalid default constructor modifier: " + iDCM.getMessage(), iDCM);
   }
 }
 /**
  * Writes the given object recursively.
  *
  * @param o to write
  */
 @Override
 public final void write(Object o) {
   if (this.state != Driver.STATE_START && this.state != Driver.STATE_VALUE) {
     throw new IllegalStateException("cannot write o");
   }
   try {
     this.target.write0(o);
   } catch (NoSuchMethodException nDC) {
     throw new IllegalArgumentException(
         "value: no default constructor: " + nDC.getMessage(), nDC);
   } catch (InvocationTargetException | InstantiationException iDC) {
     throw new IllegalArgumentException(
         "value: invalid default constructor: " + iDC.getMessage(), iDC);
   } catch (IllegalAccessException iDCM) {
     throw new IllegalArgumentException(
         "value: invalid default constructor modifier: " + iDCM.getMessage(), iDCM);
   }
 }