class Moxml::DocumentBuilder

def adapter

def adapter
  context.config.adapter
end

def build(native_doc)

def build(native_doc)
  @current_doc = context.create_document
  visit_node(native_doc)
  @current_doc
end

def children(node)

def children(node)
  context.config.adapter.children(node)
end

def initialize(context)

def initialize(context)
  @context = context
  @node_stack = []
end

def node_type(node)

def node_type(node)
  context.config.adapter.node_type(node)
end

def visit_cdata(node)

def visit_cdata(node)
  @node_stack.last&.add_child(Cdata.new(node, context))
end

def visit_children(node)

def visit_children(node)
  node_children = children(node).dup
  node_children.each do |child|
    visit_node(child)
  end
end

def visit_comment(node)

def visit_comment(node)
  @node_stack.last&.add_child(Comment.new(node, context))
end

def visit_doctype(node)

def visit_doctype(node)
  @node_stack.last&.add_child(Doctype.new(node, context))
end

def visit_document(doc)

def visit_document(doc)
  @node_stack.push(@current_doc)
  visit_children(doc)
  @node_stack.clear
end

def visit_element(node)

def visit_element(node)
  childless_node = adapter.duplicate_node(node)
  adapter.replace_children(childless_node, [])
  element = Element.new(childless_node, context)
  @node_stack.last.add_child(element)
  @node_stack.push(element) # add a parent for its children
  visit_children(node)
  @node_stack.pop # remove the parent
end

def visit_node(node)

def visit_node(node)
  method_name = "visit_#{node_type(node)}"
  return unless respond_to?(method_name, true)
  send(method_name, node)
end

def visit_processing_instruction(node)

def visit_processing_instruction(node)
  @node_stack.last&.add_child(ProcessingInstruction.new(node, context))
end

def visit_text(node)

def visit_text(node)
  @node_stack.last&.add_child(Text.new(node, context))
end