/*
 * call-seq:
 *  add_child(node)
 *
 * Add +node+ as a child of this node. Returns the new child node.
 */
static VALUE add_child(VALUE self, VALUE child)
{
  xmlNodePtr node, parent, new_child;
  Data_Get_Struct(child, xmlNode, node);
  Data_Get_Struct(self, xmlNode, parent);

  xmlUnlinkNode(node) ;

  if(!(new_child = xmlAddChild(parent, node)))
    rb_raise(rb_eRuntimeError, "Could not add new child");

  // the child was a text node that was coalesced. we need to have the object
  // point at SOMETHING, or we'll totally bomb out.
  if (new_child != node)
    DATA_PTR(child) = new_child ;

  return Nokogiri_wrap_xml_node(new_child);
}