module TablePrint::RowRecursion

def add_child(child)

def add_child(child)
  @children << child
  child.parent = self
end

def add_children(children)

def add_children(children)
  @children.concat children
  children.each { |c| c.parent = self }
  self
end

def add_formatter(name, formatter)

def add_formatter(name, formatter)
  return unless column_for(name)
  column_for(name).add_formatter(formatter)
end

def child_count

def child_count
  @children.length
end

def column_count

def column_count
  return parent.column_count if parent
  @columns.size
end

def column_for(name)

def column_for(name)
  return parent.column_for(name) if parent
  column = @columns[name.to_s] ||= Column.new(:name => name)
  # assign the data sets to the column before we return it
  # do this as late as possible, since new rows could be added at any time
  column.data ||= raw_column_data(column.name)
  column
end

def columns

def columns
  return parent.columns if parent
  raw_column_names.collect{|k, v| column_for(k)}
end

def header

def header
  padded_names = columns.collect do |column|
    f = FixedWidthFormatter.new(column.width)
    f.format(column.name)
  end
  header_string = padded_names.join(" #{TablePrint::Config.separator} ")
  header_string.upcase! if TablePrint::Config.capitalize_headers
  header_string
end

def horizontal_separator

def horizontal_separator
  columns.collect do |column|
    '-' * column.width
  end.join("-#{TablePrint::Config.separator}-")
end

def initialize

def initialize
  @children = []
  @columns = {}
end

def insert_children(i, children)

def insert_children(i, children)
  @children.insert(i, children).flatten!
  children.each {|c| c.parent = self }
  self
end

def set_column(column)

def set_column(column)
  return parent.set_column(column) if parent
  @columns[column.name.to_s] = column
end

def width

def width
  return parent.width if parent
  columns.collect(&:width).inject(&:+) + (columns.length - 1) * 3 # add (n-1)*3 for the 3-character separator
end