Revision history for DBIx-NinjaORM

v2.1.0  11/22/2012
        * Refactored retrieve_list() and new() to use a hashref as first
          argument, like insert() and update().
        * Reorganized methods alphabetically.

v2.0.0  11/19/2012
        * Generalized code, added more tests and documentation.
        * First public release.

v1.9.1  10/24/2012
        * Added 'not_null' operator.

v1.9.0  10/18/2012
        * Updated to use two separate cache times, one for the translation from
          arguments to IDs (list cache) and one for the objects (object cache).

v1.8.4  10/02/2012
        * Added get_object_cache_keys().

v1.8.3  10/01/2012
        * Added "set" parameter to update() to allow specifying complex set
          clauses.

v1.8.2  09/07/2012
        * Added option to trace cache operations.

v1.8.1  09/06/2012
        * Adjusted the order of when we invalidate the object cache in update().
        * Forced the cache keys and values to be lower case, to account for
          case-insensitive collations.

v1.8.0  08/30/2012
        * Implemented cache of the translation from arguments to IDs in
          retrieve_list().

v1.7.7  05/22/2012
        * Modified parse_filtering_criteria() to return whether filtering fields
          were detected in the arguments passed to retrieve_list(),
          independently of whether filtering clauses are generated or not.
        * Tweaked retrieve_list() to warn about missing filtering fields only
          when none was passed to retrieve_list(), and ignore the case when all
          of them are undef or empty arrays.

v1.7.6  05/08/2012
        * Improved get() to prevent retrieving private properties and to error
          on non-existent properties only when the object comes from
          retrieve_list() which is guaranteed to populate the object correctly.

v1.7.5  03/20/2012
        * Fixed trying to invalidate the cached object for keys with undefined
          values.

v1.7.4  03/20/2012
        * Added unitary operator 'null'.

v1.7.3  02/24/2012
        * Added get().

v1.7.2  08/08/2011
        * Added operator 'between' for retrieve_list(), reengineered the return
          values of build_filtering_clause() to allow for more than one bind
          variable to be returned.

v1.7.1  06/10/2011
        * Added more trace information for cache operations.
        * Modified update() to invalidate cached versions of objects.
        * Added meta information 'cache_key_field' to allow specifying a
          different cache key field than the primary key.
        * Added get_object_cache_key(), to allow subclassing to create complex
          cache keys.

v1.7.0  06/07/2011
        * Refactored filtering operators to use (?:=|not|<=|>=|<|>).
        * Added code to detect parameters that cannot be handled by
          retrieve_list(). This helps the calling code to detect typos, missing
          filtering fields in the static class declaration or obsolete argument
          names.
        * Set up a list of reserved arguments for retrieve_list().
        * Fixed retrieve_list( id => [ 1, 2 ] ) that was converting to
          WHERE id = 1 AND id = 2 instead of WHERE id IN ( 1, 2 ).

v1.6.1  05/17/2011
        * Added last insert ID value to the object upon successful insert.

v1.6.0  03/29/2011
        * Refactored reload().

v1.5.4  03/04/2011
        * Added 'show_queries' argument to retrieve_list().

v1.5.3  01/31/2011
        * Added dump().

v1.5.2  01/27/2011
        * Added function to flatten an object based on a list of fields.

v1.5.1  01/24/2011
        * Changed retrieve_list() to return pagination info in addition to the
          results only when pagination was requested to begin with.
        * Added option to set "pagination => 1"  in retrieve_list(), as a
          shortcut to get all the defaults.

v1.5.0  01/10/2011
        * Implemented delete().

v1.4.1  01/06/2011
        * Simplified 'order_by', removed option to pass a data structure in
          favor of raw SQL.
        * Fixed retrieve_list() to handle the case when the query has joins but
          we need to lock the rows.

v1.4.0  12/21/2010
        * Split validation from setting properties.
        * Added concept of read-only fields.
        * Added cached_static_class_info(), which is ~6x faster than
          static_class_info().

v1.3.0  12/16/2010
        * Added 'unique_fields' to the meta object information and created a
          method to access it.
        * Simplified caching of objects.
        * Expanded parse_filtering_criteria() to allow filtering on the opposite
          of a criteria.
        * Implemented pagination for retrieve_list().
        * Refactored how cache keys are generated.
        * Added invalidate_cached_object() to remove all the cached versions of
          a given object.
        * Added 'lock' and 'allow_all' arguments to retrieve_list().
        * Added option to specify pre-generated primary keys in insert().
        * Added warnings to prevent hash/hashref confusion in the first argument
          of insert() and update()
        * Fixed insert() to work with tables that don't have a primary key.
        * Added unique fields to the list of available filtering criteria in
          retrieve_list().
        * Improved 'order_by' parsing and defaults in retrieve_list(), allowed
          raw SQL in 'order_by'.
        * Modified update() to accept restrictions on the where clause.

v1.2.0  02/10/2010
        * Changed insert() to allow calling it directly on a class, if no
          object is needed afterwards.
        * Added static_class_info() and accessors for its configurable options.
        * Added object-level cache.
        * Added 'force' argument to set(), to optionally disable validation.

v1.1.0  12/08/2010
        * Added insert(), update(), and new().
        * Fixed set() to remove primary key fields and fields starting with an
          underscore.
        * Added id().
        * Refactored retrieve_list() to allow subclassing.
        * Added table prefix for the fields not specifing one explicitely when
          creating filtering criteria.

v1.0.2  10/28/2010
        * Added reload().

v1.0.1  02/01/2010
        * Added clone().

v1.0.0  12/17/2009
        * First version.