class Nokogiri::LibXML::XmlDocument

:nodoc:
use at the point of creation, so we can be sure the document will be GCed properly

def self.release ptr

def self.release ptr
  doc = LibXML::XmlDocumentCast.new(ptr)
  func = LibXML.xmlDeregisterNodeDefault(nil)
  begin
    ns  = LibXML::XmlNodeSetCast.new(doc[:_private].get_pointer(LibXML.pointer_offset(1)))
    ns[:nodeNr].times do |j|
      node_cstruct = LibXML::XmlNode.new(ns[:nodeTab].get_pointer(LibXML.pointer_offset(j)))
      case node_cstruct[:type]
      when Nokogiri::XML::Node::ATTRIBUTE_NODE
        LibXML.xmlFreePropList(node_cstruct)
      else
        LibXML.xmlAddChild(doc, node_cstruct) if node_cstruct[:parent].null?
      end
    end
    LibXML::XmlNodeSet.release(ns.pointer)
    LibXML.free(doc[:_private])
  rescue
    puts "Nokogiri::LibXML::XmlDocument.release: exception: '#{$!}'"
  ensure
    LibXML.xmlFreeDoc(ptr)
    LibXML.xmlDeregisterNodeDefault(func)
  end
end

def initialize(ptr)

def initialize(ptr)
  super(ptr)
  self.alloc_tuple
end