def add_column(label, header: nil, align_header: nil, align_body: nil,
      width: nil, formatter: :to_s.to_proc, &extractor)

      column_label =
        case label
        when Integer, Symbol
          label
        when String
          label.to_sym
        end

      if column_registry.include?(column_label)
        raise InvalidColumnLabelError, "Column label already used in this table."
      end

      @column_registry[column_label] =
        Column.new(
          header: (header || label).to_s,
          align_header: align_header || @align_header,
          align_body: align_body || @align_body,
          width: (width || @default_column_width),
          formatter: formatter,
          extractor: (extractor || label.to_proc)
        )
    end
def add_column(label, header: nil, align_header: nil, align_body: nil,
      width: nil, formatter: :to_s.to_proc, &extractor)

      column_label =
        case label
        when Integer, Symbol
          label
        when String
          label.to_sym
        end

      if column_registry.include?(column_label)
        raise InvalidColumnLabelError, "Column label already used in this table."
      end

      @column_registry[column_label] =
        Column.new(
          header: (header || label).to_s,
          align_header: align_header || @align_header,
          align_body: align_body || @align_body,
          width: (width || @default_column_width),
          formatter: formatter,
          extractor: (extractor || label.to_proc)
        )
    end
@param [Enumerable] sources the underlying Enumerable from which the table will derive its data
 @param [Array[Symbol]] cols Specifies the initial columns. The Symbols provided must
   be unique. Each element of the Array  will be used to create a column whose content is
   created by calling the corresponding method on each element of sources. Note
   the {#add_column} method is a much more flexible way to set up columns on the table.
 @param [Array[Symbol]] columns <b>DEPRECATED</b> Use <tt>cols</tt> instead.
 @param [Integer, nil] column_width The default column width for columns in this
   table, not excluding padding. If <tt>nil</tt>, then {DEFAULT_COLUMN_WIDTH} will be used.
 @param [:start, nil, Integer] header_frequency Controls the display of column headers.
   If passed <tt>:start</tt>, headers will be shown at the top of the table only. If passed <tt>nil</tt>,
   headers will not be shown. If passed an Integer N (> 0), headers will be shown at the top of the table,
   then repeated every N rows.
 @param [nil, Integer] wrap_header_cells_to Controls wrapping behaviour for header
   cells if the content thereof is longer than the column's fixed width. If passed <tt>nil</tt> (default),
   content will be wrapped for as many rows as required to accommodate it. If passed an Integer N (> 0),
   content will be wrapped up to N rows and then truncated thereafter.
 @param [nil, Integer] wrap_body_cells_to Controls wrapping behaviour for table cells (excluding
   headers), if their content is longer than the column's fixed width. If passed <tt>nil</tt>, content will
   be wrapped for as many rows as required to accommodate it. If passed an Integer N (> 0), content will be
   wrapped up to N rows and then truncated thereafter.
   headers), if their content is longer than the column's fixed width. If passed <tt>nil</tt>, content will
   be wrapped for as many rows as required to accommodate it. If passed an Integer N (> 0), content will be
   wrapped up to N rows and then truncated thereafter.
 @param [nil, String] horizontal_rule_character Determines the character used to draw
   horizontal lines where required in the table. If omitted or passed <tt>nil</tt>, defaults to
   {DEFAULT_HORIZONTAL_RULE_CHARACTER}. If passed something other than <tt>nil</tt> or a single-character
   String, raises {InvalidHorizontalRuleCharacterError}.
 @param [nil, String] vertical_rule_character Determines the character used to draw
   vertical lines where required in the table. If omitted or passed <tt>nil</tt>, defaults to
   {DEFAULT_VERTICAL_RULE_CHARACTER}. If passed something other than <tt>nil</tt> or a single-character
   String, raises {InvalidVerticalRuleCharacterError}.
 @param [nil, String] intersection_character Determines the character used to draw
   line intersections and corners where required in the table. If omitted or passed <tt>nil</tt>,
   defaults to {DEFAULT_INTERSECTION_CHARACTER}. If passed something other than <tt>nil</tt> or
   a single-character String, raises {InvalidIntersectionCharacterError}.
 @param [nil, String] truncation_indicator Determines the character used to indicate that a
   cell's content has been truncated. If omitted or passed <tt>nil</tt>,
   defaults to {DEFAULT_TRUNCATION_INDICATOR}. If passed something other than <tt>nil</tt> or
   a single-character String, raises {InvalidTruncationIndicatorError}.
 @param [nil, Integer] column_padding Determines the amount of blank space with which to pad either
   of each column. Defaults to 1.
 @param [:left, :right, :center] align_header (:center) Determines the alignment of header text
   for columns in this Table. Can be overridden for individual columns using the
   <tt>align_header</tt> option passed to {#add_column}
 @param [:left, :right, :center, :auto] align_body (:auto) Determines the alignment of body cell
   (i.e. non-header) content within columns in this Table. Can be overridden for individual columns
   using the <tt>align_body</tt> option passed to {#add_column}. If passed <tt>:auto</tt>,
   alignment is determined by cell content, with numbers aligned right, booleans
   center-aligned, and other values left-aligned.
 @return [Table] a new {Table}
 @raise [InvalidColumnLabelError] if non-unique Symbols are provided to columns.
 @raise [InvalidHorizontalRuleCharacterError] if invalid argument passed to horizontal_rule_character.
 @raise [InvalidVerticalRuleCharacterError] if invalid argument passed to vertical_rule_character.
 Adds a column to the Table.

 @param [Symbol, String, Integer] label A unique identifier for this column, which by
   default will also be used as the column header text (see also the header param). If the
   extractor argument is not also provided, then the label argument should correspond to
   a method to be called on each item in the table sources to provide the content
   for this column. If a String is passed as the label, then it will be converted to
   a Symbol for the purpose of serving as this label.
 @param [nil, #to_s] header (nil) Text to be displayed in the column header. If passed nil,
   the column's label will also be used as its header text.
 @param [:left, :center, :right, nil] align_header (nil) Specifies how the header text
   should be aligned. If <tt>nil</tt> is passed, then the alignment is determined
   by the Table-level setting passed to the <tt>align_header</tt> (which itself defaults
   to <tt>:center</tt>). Otherwise, this option determines the alignment of the header
   content for this column.
 @param [:left, :center, :right, :auto, nil] align_body (nil) Specifies how the cell body contents
   should be aligned. If <tt>nil</tt> is passed, then the alignment is determined
   by the Table-level setting passed to the <tt>align_body</tt> option on Table initialization
   (which itself defaults to <tt>:auto</tt>). Otherwise this option determines the alignment of
   this column. If <tt>:auto</tt> is passed, the alignment is determined by the type of the cell
   value, with numbers aligned right, booleans center-aligned, and other values left-aligned.
   Note header text alignment is configured separately using the :align_header param.
 @param [Integer] width (nil) Specifies the width of the column, excluding padding. If
   nil, then the column will take the width provided by the `column_width` param
   with which the Table was initialized.
 @param [#to_proc] formatter (:to_s.to_proc) A lambda or other callable object that
   will be passed the calculated value of each cell to determine how it should be displayed. This
   is distinct from the extractor (see below). For example, if the extractor for this column
   generates a Date, then the formatter might format that Date in a particular way.
   If no formatter is provided, then <tt>.to_s</tt> will be called on
   the extracted value of each cell to determine its displayed content.
 @param [#to_proc] extractor A block or other callable
   that will be passed each of the Table sources to determine the value in each cell of this
   column. If this is not provided, then the column label will be treated as a method to be
   called on each source item to determine each cell's value.
 @raise [InvalidColumnLabelError] if label has already been used for another column in this
   Table. (This is case-sensitive, but is insensitive to whether a String or Symbol is passed
   to the label parameter.)