/**
  * Write a record
  *
  * @param   lang.Generic object
  * @param   string[] fields if omitted, all fields will be written
  */
 public function write(\lang\Generic $object, array $fields = [])
 {
     $values = [];
     $class = $object->getClass();
     if (!$fields) {
         foreach ($class->getFields() as $f) {
             $values[] = $class->getMethod('get' . ucfirst($f->getName()))->invoke($object);
         }
     } else {
         foreach ($fields as $name) {
             $values[] = $class->getMethod('get' . ucfirst($name))->invoke($object);
         }
     }
     return $this->writeValues($values);
 }
 /**
  * Write a record
  *
  * @param   lang.Generic object
  * @param   string[] fields if omitted, all fields will be written
  */
 public function write(Generic $object, array $fields = [])
 {
     $values = [];
     $class = $object->getClass();
     // Use the array-cast trick to access private and protected members
     if ($fields) {
         foreach ($fields as $name) {
             $values[] = $class->getField($name)->setAccessible(true)->get($object);
         }
     } else {
         foreach ($class->getFields() as $field) {
             if (!($field->getModifiers() & MODIFIER_STATIC)) {
                 $values[] = $field->setAccessible(true)->get($object);
             }
         }
     }
     return $this->writeValues($values);
 }
 /**
  * Marshal an object to xml
  *
  * @param   xml.Node target
  * @param   lang.Object instance
  * @param   [:var] inject
  * @return  xml.Node the given target
  */
 public function marshalTo(\xml\Node $target = null, \lang\Generic $instance, $inject = [])
 {
     $class = $instance->getClass();
     // Create node if not existant
     if (null === $target) {
         $target = new \xml\Node(null);
     }
     self::recurse($instance, $class, $target, $inject);
     return $target;
 }