Version 0.022 - 2026-08-05
 - Support various web framework Upload objects being used as ->input
 - Use content_type if available in preference to file extension or
   content heuristics.
 - Differentiate between real_file_name and client_file_name, and ignore
   the file extension of real_file_name if client_file_name exists.
   (e.g. things broke when Catalyst changed the file extension to .upload)
   These show as new attributes on the Decoder.
 - Much improved detection and handling of charset for CSV, TSV, and HTML
 - Properly handle consequences of writes to the ->fields(...) attribute
   by clearing other attributes.
 - Fix several col_map lifecycle bugs: preserve the caller's original
   array, restore the supplied map after clearing search results, re-resolve
   it after fields change, and avoid reusing a previous search result during
   subsequent find_table calls.
 - Fix bug when using ->seek on a record iterator which had reached EOF
   or was in the middle of counting blank lines.
 - Fix ability to use ->all on a record iterator where record objects could
   stringify to a false value.
 - More API validation and better error messages in a variety of edge cases.
 - Stop logging at 'notice' level since it isn't supported by all common
   logger objects.
 - Fix numerous documentation mistakes, including callback argument list of
   on_partial_match and on_unknown_columns.
 - Additionally pass the %candidate structure to on_unknown_columns callback.

Version 0.021 - 2024-05-02
 - Use ->table_search_results->{...}{row} instead of {row_idx}
 - Allow initializing TableReader 'fields' attribute with Field objects
   (had only been allowing strings and hashrefs)
 - Decoder::Mock now correctly handles empty tables (no rows)

Version 0.020 - 2024-04-30
 - Rename on_validation_fail -> on_validation_error
   The action codes are the same, but the callback has different arguments.
   Old callbacks applied using the attribute name 'on_validation_fail' will
   continue to work.
 - New iterator attribute 'dataset_idx', for keeping track of which dataset
   you're on.
 - Unimplemented Iterator->seek now dies as per the documentation.
   (no built-in iterator lacked support for seek, so unlikely to matter)

Version 0.015 - 2024-04-27
 - Better support for fields sharing name, with Field->addr (refaddr) and
   TableReader->field_by_addr
 - Decoder iterators now have ->row attribute
 - Spreadsheet decoder ->position includes sheet number and now uses
   1-based row number (as originally intended)
 - Results of find_table are stored in table_search_results for better
   inspection and reporting on a failure.  This allows detection messages
   to be associated with a row, and various conflicts to be associated with
   a column (without parsing message text).
 - On a failed find_table, user can inspect the attempts in
   table_search_results->{candidates} and select one to be ->{found}, and
   then proceed to create the iterator.
 - col_map is now a full attribute and can be specified in the constructor.
   find_table starts with the user-supplied value and tries to fill in any
   'undef' values in that array.
 - New settings on_partial_match, on_ambiguous_columns, and modified
   official values of on_unknown_columns.  These provide better control
   over what counts as an error and whether to continue the search.

Version 0.014 - 2024-03-25
 - Fix compatibility with newest Spreadsheet::ParseXLSX

Version 0.013 - 2024-03-22
 - Fix bug in unit tests causing failure when MRO::Compat not installed

Version 0.012 - 2024-03-07
 - Field now has 'coerce' attribute which can be a coderef, or enable
   Type::Tiny coercion.
 - TableReader 'input' attribute can now be an arrayref, as a shorthand
   for the 'Mock' decoder.
 - Improved unit tests

Version 0.011 - 2019-06-27
 - Allow per-field 'trim' value to be a regex or coderef
 - Change dist version-munger to Dist::Zilla::Plugin::OurPkgVersion
 - Exclude ::Decoder::HTML files from getting shipped with main dist

Version 0.010 - 2019-01-02
 - Fix several bugs related to multi-line headers
 - Also allow 'input' to be a Spreadsheet::ParseExcel::Workbook
 - Auto-detection support for ::Decoder::HTML companion module

Version 0.008 - 2018-11-28
 - 'input' attribute may now be a Spreadsheet::ParseExcel::Worksheet
 - When specifying 'decoder' attribute as an arrayref or hashref,
   the CLASS argument is now optional, allowing auto-detection while
   still supplying extre optional attributes for the decoder.
 - Wrokaround for Libre Office row-max bug
 - New Decoder::XLSX attribute 'xls_formatter', useful for casting
   local datetimes to a known time zone.
 - Prevent loading Text::CSV_XS if its version is too old.

Version 0.007 - 2018-03-15
 - Fix various bugs in detect_input_format relevant to CSV files
 - Enhanced debug-level logging during the table search algorighm

Version 0.006 - 2018-03-08
 - Auto-detect CSV Unicode format by looking for BOM, unless handle
   already has an IO layer to specify encoding.
 - Improved logging, and logging API.  'log' attribute is no longer public
   on Decoder objects.

Version 0.005 - 2017-11-26
 - Remove 'filters' feature since it adds overhead and not much value
 - Fix bug when creating multiple parallel record iterators
 - Sanitize data headers written in logging messages

Version 0.004 - 2017-11-26
 - Re-add Text::CSV as a hard dependency since it's small and I need a recent
   version for all the tests to pass.

Version 0.003 - 2017-11-25
 - Remove hard dependencies on CSV and Excel parsers
 - Use new "Mock" decoder for format-independent test cases
 - Fix handling of $TableReader->log to match API description
 - Fix bugs to be compatible back to 5.8.9

Version 0.002 - 2017-11-24
 - Fixed 'filters' feature
 - Iterators of decoders are now created on each call, rather than cached
 - Many documentation improvements

Version 0.001 - 2017-11-24
 - Initial public version
