Provided by: librose-db-object-perl_0.820-2_all bug

NAME

       Rose::DB::Object::Metadata - Database object metadata.

SYNOPSIS

         use Rose::DB::Object::Metadata;

         $meta = Rose::DB::Object::Metadata->new(class => 'Product');
         # ...or...
         $meta = Rose::DB::Object::Metadata->for_class('Product');

         #
         # Auto-initialization
         #

         $meta->table('products'); # optional if class name ends with "::Product"
         $meta->auto_initialize;

         #
         # ...or manual setup
         #

         $meta->setup
         (
           table => 'products',

           columns =>
           [
             id          => { type => 'int', primary_key => 1 },
             name        => { type => 'varchar', length => 255 },
             description => { type => 'text' },
             category_id => { type => 'int' },

             status =>
             {
               type      => 'varchar',
               check_in  => [ 'active', 'inactive' ],
               default   => 'inactive',
             },

             start_date  => { type => 'datetime' },
             end_date    => { type => 'datetime' },

             date_created  => { type => 'timestamp', default => 'now' },
             last_modified => { type => 'timestamp', default => 'now' },
           ],

           unique_key => 'name',

           foreign_keys =>
           [
             category =>
             {
               class       => 'Category',
               key_columns =>
               {
                 category_id => 'id',
               }
             },
           ],

           relationships =>
           [
             prices =>
             {
               type       => 'one to many',
               class      => 'Price',
               column_map => { id => 'id_product' },
             },
           ],
         );

         #
         # ...or even more verbose manual setup (old-style, not recommended)
         #

         $meta->table('products');

         $meta->columns
         (
           id          => { type => 'int', primary_key => 1 },
           name        => { type => 'varchar', length => 255 },
           description => { type => 'text' },
           category_id => { type => 'int' },

           status =>
           {
             type      => 'varchar',
             check_in  => [ 'active', 'inactive' ],
             default   => 'inactive',
           },

           start_date  => { type => 'datetime' },
           end_date    => { type => 'datetime' },

           date_created  => { type => 'timestamp', default => 'now' },
           last_modified => { type => 'timestamp', default => 'now' },
         );

         $meta->unique_key('name');

         $meta->foreign_keys
         (
           category =>
           {
             class       => 'Category',
             key_columns =>
             {
               category_id => 'id',
             }
           },
         );

         $meta->relationships
         (
           prices =>
           {
             type       => 'one to many',
             class      => 'Price',
             column_map => { id => 'id_product' },
           },
         );

         ...

DESCRIPTION

       Rose::DB::Object::Metadata objects store information about a single table in a database: the name of the
       table, the names and types of columns, any foreign or unique keys, etc.  These metadata objects are also
       responsible for supplying information to, and creating object methods for, the Rose::DB::Object-derived
       objects to which they belong.

       Rose::DB::Object::Metadata objects also store information about the Rose::DB::Objects that front the
       database tables they describe.  What might normally be thought of as "class data" for the
       Rose::DB::Object is stored in the metadata object instead, in order to keep the method namespace of the
       Rose::DB::Object-derived class uncluttered.

       Rose::DB::Object::Metadata objects are per-class singletons; there is one Rose::DB::Object::Metadata
       object for each Rose::DB::Object-derived class.  Metadata objects are almost never explicitly
       instantiated.  Rather, there are automatically created and accessed through Rose::DB::Object-derived
       objects' meta method.

       Once created, metadata objects can be populated manually or automatically.  Both techniques are shown in
       the synopsis above.  The automatic mode works by asking the database itself for the information.  There
       are some caveats to this approach.  See the auto-initialization section for more information.

       Rose::DB::Object::Metadata objects contain three categories of objects that are responsible for creating
       object methods in Rose::DB::Object-derived classes: columns, foreign keys, and relationships.

       Column objects are subclasses of Rose::DB::Object::Metadata::Column.  They are intended to store as much
       information as possible about each column.  The particular class of the column object created for a
       database column is determined by a mapping table.   The column class, in turn, is responsible for
       creating the accessor/mutator method(s) for the column.  When it creates these methods, the column class
       can use (or ignore) any information stored in the column object.

       Foreign key objects are of the class Rose::DB::Object::Metadata::ForeignKey.  They store information
       about columns that refer to columns in other tables that are fronted by their own
       Rose::DB::Object-derived classes.  A foreign key object is responsible for creating accessor method(s) to
       fetch the foreign object from the foreign table.

       Relationship objects are subclasses of Rose::DB::Object::Metadata::Relationship.  They store information
       about a table's relationship to other tables that are fronted by their own Rose::DB::Object-derived
       classes.  The particular class of the relationship object created for each relationship is determined by
       a mapping table.   A relationship object is responsible for creating accessor method(s) to fetch the
       foreign objects from the foreign table.

AUTO-INITIALIZATION

       Manual population of metadata objects can be tedious and repetitive.  Nearly all of the information
       stored in a Rose::DB::Object::Metadata object exists in the database in some form.  It's reasonable to
       consider simply extracting this information from the database itself, rather than entering it all
       manually.  This automatic metadata extraction and subsequent Rose::DB::Object::Metadata object population
       is called "auto-initialization."

       The example of auto-initialization in the synopsis above is the most succinct variant:

           $meta->auto_initialize;

       As you can read in the documentation for the auto_initialize method, that's shorthand for individually
       auto-initializing each part of the metadata object: columns, the primary key, unique keys, and foreign
       keys.  But this brevity comes at a price.  There are many caveats to auto-initialization.

   Caveats
       Start-Up Cost

       In order to retrieve the information required for auto-initialization, a database connection must be
       opened and queries must be run.  Sometimes these queries include complex joins.  All of these queries
       must be successfully completed before the Rose::DB::Object-derived objects that the
       Rose::DB::Object::Metadata is associated with can be used.

       In an environment like mod_perl, server start-up time is precisely when you want to do any expensive
       operations.  But in a command-line script or other short-lived process, the overhead of auto-initializing
       many metadata objects may become prohibitive.

       Also, don't forget that auto-initialization requires a database connection.  Rose::DB::Object-derived
       objects can sometimes be useful even without a database connection (e.g., to temporarily store
       information that will never go into the database, or to synthesize data using object methods that have no
       corresponding database column).  When using auto-initialization, this is not possible because the
       Rose::DB::Object-derived class won't even load if auto-initialization fails because it could not connect
       to the database.

       Detail

       First, auto-initialization cannot generate information that exists only in the mind of the programmer.
       The most common example is a relationship between two database tables that is either ambiguous or totally
       unexpressed by the database itself.

       For example, if a foreign key constraint does not exist, the relationship between rows in two different
       tables cannot be extracted from the database, and therefore cannot be auto-initialized.

       Even within the realm of information that, by all rights, should be available in the database, there are
       limitations.  Although there is a handy DBI API for extracting metadata from databases, unfortunately,
       very few DBI drivers support it fully.  Some don't support it at all.  In almost all cases, some manual
       work is required to (often painfully) extract information from the database's "system tables" or
       "catalog."

       More troublingly, databases do not always provide all the metadata that a human could extract from the
       series of SQL statement that created the table in the first place.  Sometimes, the information just isn't
       in the database to be extracted, having been lost in the process of table creation.  Here's just one
       example.  Consider this MySQL table definition:

           CREATE TABLE mytable
           (
             id    INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
             code  CHAR(6),
             flag  BOOLEAN NOT NULL DEFAULT 1,
             bits  BIT(5) NOT NULL DEFAULT '00101',
             name  VARCHAR(64)
           );

       Now look at the metadata that MySQL 4 stores internally for this table:

           mysql> describe mytable;
           +-------+------------------+------+-----+---------+----------------+
           | Field | Type             | Null | Key | Default | Extra          |
           +-------+------------------+------+-----+---------+----------------+
           | id    | int(10) unsigned |      | PRI | NULL    | auto_increment |
           | code  | varchar(6)       | YES  |     | NULL    |                |
           | flag  | tinyint(1)       |      |     | 1       |                |
           | bits  | tinyint(1)       |      |     | 101     |                |
           | name  | varchar(64)      | YES  |     | NULL    |                |
           +-------+------------------+------+-----+---------+----------------+

       Note the following divergences from the "CREATE TABLE" statement.

       •   The  "code"  column  has  changed  from  CHAR(6)  to VARCHAR(6).  This is troublesome if you want the
           traditional semantics of a CHAR type, namely the padding with spaces of values that are less than the
           column length.

       •   The "flag" column has changed from BOOLEAN to TINYINT(1).  The default accessor  method  created  for
           boolean  columns  has  value coercion and formatting properties that are important to this data type.
           The default accessor created for integer columns lacks these constraints.  The metadata object has no
           way of knowing that "flag" was supposed to be a boolean column, and thus  makes  the  wrong  kind  of
           accessor method.  It is thus possible to store, say, a value of "7" in the "flag" column.  Oops.

       •   The  "bits" column has changed from BIT(5) to TINYINT(1).  As in the case of the "flag" column above,
           this type change prevents the correct accessor method  from  being  created.   The  default  bitfield
           accessor  method  auto-inflates  column  values  into  Bit::Vector  objects, which provide convenient
           methods for bit manipulation.  The default accessor created for integer columns does no such thing.

       Remember that the auto-initialization process can only consider  the  metadata  actually  stored  in  the
       database.  It has no access to the original "create table" statement.  Thus, the semantics implied by the
       original table definition are effectively lost.

       Again,  this is just one example of the kind of detail that can be lost in the process of converting your
       table definition into metadata that is stored in the database.  Admittedly, MySQL is  perhaps  the  worst
       case-scenario,  having a well-deserved reputation for disregarding the wishes of table definitions.  (The
       use of implicit default values for "NOT NULL" columns is yet another example.)

       Thankfully, there is a solution to this dilemma.  Remember that auto-initialization is actually a  multi-
       step  process  hiding  behind that single call to the auto_initialize method.  To correct the sins of the
       database, simply break the auto-initialization process into its components.  For example, here's  how  to
       correctly auto-initialize the "mytable" example above:

           # Make a first pass at column setup
           $meta->auto_init_columns;

           # Account for inaccuracies in DBD::mysql's column info by
           # replacing incorrect column definitions with new ones.

           # Fix CHAR(6) column that shows up as VARCHAR(6)
           $meta->column(code => { type => 'char', length => 6 });

           # Fix BIT(5) column that shows up as TINYINT(1)
           $meta->column(bits => { type => 'bits', bits => 5, default => 101 });

           # Fix BOOLEAN column that shows up as TINYINT(1)
           $meta->column(flag => { type => 'boolean', default => 1 });

           # Do everything else
           $meta->auto_initialize;

       Note  that  auto_initialize  was  called at the end.  Without the "replace_existing" parameter, this call
       will preserve any existing metadata, rather than overwriting it, so our "corrections" are safe.

       Maintenance

       The price of auto-initialization is eternal vigilance.  "What does that mean?  Isn't  auto-initialization
       supposed  to  save  time  and  effort?"   Well, yes, but at a cost.  In addition to the caveats described
       above, consider what happens when a table definition changes.

       "Ah ha!" you say, "My existing class will automatically pick up the changes the next  time  it's  loaded!
       Auto-initialization  at  its  finest!"  But is it?  What if you added a "NOT NULL" column with no default
       value?  Yes, your existing auto-initialized class will pick up the change, but your existing code will no
       longer be able to save one these objects.  Or what if you're using MySQL and your newly added  column  is
       one  of  the  types  described above that requires manual tweaking in order to get the desired semantics.
       Will you always remember to make this change?

       Auto-initialization is not a panacea.  Every time you make a change to your  database  schema,  you  must
       also  revisit  each  affected  Rose::DB::Object-derived  class  to  at  least consider whether or not the
       metadata needs to be corrected or updated.

       The trade-off may be well worth it, but it's still something to think about.  There is, however, a hybrid
       solution that might be even better.  Continue on to the next section to learn more.

   Code Generation
       As described in the section above, auto-initializing metadata at runtime by  querying  the  database  has
       many  caveats.   An alternate approach is to query the database for metadata just once, and then generate
       the equivalent Perl code which can be pasted directly into the class definition in place of the  call  to
       auto_initialize.

       Like the auto-initialization process itself, perl code generation has a convenient wrapper method as well
       as  separate  methods  for  the  individual  parts.   All  of the perl code generation methods begin with
       "perl_", and they support some rudimentary code formatting options  to  help  the  code  conform  to  you
       preferred style.  Examples can be found with the documentation for each perl_* method.

       This  hybrid  approach  to  metadata population strikes a good balance between upfront effort and ongoing
       maintenance.  Auto-generating the Perl code for the initial class  definition  saves  a  lot  of  tedious
       typing.   From  that point on, manually correcting and maintaining the definition is a small price to pay
       for the decreased start-up cost, the ability to use the class in the absence of  a  database  connection,
       and  the  piece  of  mind that comes from knowing that your class is stable, and won't change behind your
       back in response to an "action at a distance" (i.e., a database schema update).

CLASS METHODS

       auto_prime_caches [BOOL]
           Get or set a boolean value that indicates whether or not the prime_caches method will be called  from
           within  the  initialize  method.   The  default  is  true  if  the  "MOD_PERL"  environment  variable
           ($ENV{'MOD_PERL'}) is set to a true value, false otherwise.

       clear_all_dbs
           Clears the db attribute of the metadata object for each registered class.

       column_type_class TYPE [, CLASS]
           Given the column type string TYPE, return the name of the  Rose::DB::Object::Metadata::Column-derived
           class  used to store metadata and create the accessor method(s) for columns of that type.  If a CLASS
           is passed, the column  type  TYPE  is  mapped  to  CLASS.   In  both  cases,  the  TYPE  argument  is
           automatically converted to lowercase.

       column_type_classes [MAP]
           Get    or    set    the    hash   that   maps   column   type   strings   to   the   names   of   the
           Rose::DB::Object::Metadata::Column-derived classes  used  to  store  metadata   and  create  accessor
           method(s) for columns of that type.

           This  hash  is  class  data.   If  you  want  to  modify  it,  I  suggest making your own subclass of
           Rose::DB::Object::Metadata and then setting that as the meta_class of your Rose::DB::Object subclass.

           If passed MAP (a list of type/class pairs or a reference to a hash of the same) then MAP replaces the
           current column type mapping.  Returns a list of type/class pairs (in list context) or a reference  to
           the hash of type/class mappings (in scalar context).

           The default mapping of type names to class names is:

             scalar    => Rose::DB::Object::Metadata::Column::Scalar

             char      => Rose::DB::Object::Metadata::Column::Character
             character => Rose::DB::Object::Metadata::Column::Character
             varchar   => Rose::DB::Object::Metadata::Column::Varchar
             varchar2  => Rose::DB::Object::Metadata::Column::Varchar
             nvarchar  => Rose::DB::Object::Metadata::Column::Varchar
             nvarchar2 => Rose::DB::Object::Metadata::Column::Varchar
             string    => Rose::DB::Object::Metadata::Column::Varchar

             text      => Rose::DB::Object::Metadata::Column::Text
             blob      => Rose::DB::Object::Metadata::Column::Blob
             bytea     => Rose::DB::Object::Metadata::Column::Pg::Bytea

             bits      => Rose::DB::Object::Metadata::Column::Bitfield
             bitfield  => Rose::DB::Object::Metadata::Column::Bitfield

             bool      => Rose::DB::Object::Metadata::Column::Boolean
             boolean   => Rose::DB::Object::Metadata::Column::Boolean

             int       => Rose::DB::Object::Metadata::Column::Integer
             integer   => Rose::DB::Object::Metadata::Column::Integer

             tinyint   => Rose::DB::Object::Metadata::Column::Integer
             smallint  => Rose::DB::Object::Metadata::Column::Integer
             mediumint => Rose::DB::Object::Metadata::Column::Integer

             bigint    => Rose::DB::Object::Metadata::Column::BigInt

             serial    => Rose::DB::Object::Metadata::Column::Serial
             bigserial => Rose::DB::Object::Metadata::Column::BigSerial

             enum      => Rose::DB::Object::Metadata::Column::Enum

             num       => Rose::DB::Object::Metadata::Column::Numeric
             numeric   => Rose::DB::Object::Metadata::Column::Numeric
             decimal   => Rose::DB::Object::Metadata::Column::Numeric
             float     => Rose::DB::Object::Metadata::Column::Float
             float8    => Rose::DB::Object::Metadata::Column::DoublePrecision

             'double precision' =>
               Rose::DB::Object::Metadata::Column::DoublePrecision

             time      => Rose::DB::Object::Metadata::Column::Time
             interval  => Rose::DB::Object::Metadata::Column::Interval

             date      => Rose::DB::Object::Metadata::Column::Date
             datetime  => Rose::DB::Object::Metadata::Column::Datetime
             timestamp => Rose::DB::Object::Metadata::Column::Timestamp

             timestamptz =>
               Rose::DB::Object::Metadata::Column::TimestampWithTimeZone

             'timestamp with time zone' =>
               Rose::DB::Object::Metadata::Column::TimestampWithTimeZone

             'datetime year to fraction' =>
               Rose::DB::Object::Metadata::Column::DatetimeYearToFraction

             'datetime year to fraction(1)' =>
               Rose::DB::Object::Metadata::Column::DatetimeYearToFraction1

             'datetime year to fraction(2)' =>
               Rose::DB::Object::Metadata::Column::DatetimeYearToFraction2

             'datetime year to fraction(3)' =>
               Rose::DB::Object::Metadata::Column::DatetimeYearToFraction3

             'datetime year to fraction(4)' =>
               Rose::DB::Object::Metadata::Column::DatetimeYearToFraction4

             'datetime year to fraction(5)' =>
               Rose::DB::Object::Metadata::Column::DatetimeYearToFraction5

             'timestamp with time zone' =>
               Rose::DB::Object::Metadata::Column::Timestamp

             'timestamp without time zone' =>
               Rose::DB::Object::Metadata::Column::Timestamp

             'datetime year to second' =>
               Rose::DB::Object::Metadata::Column::DatetimeYearToSecond

             'datetime year to minute' =>
               Rose::DB::Object::Metadata::Column::DatetimeYearToMinute

             'datetime year to month' =>
               Rose::DB::Object::Metadata::Column::DatetimeYearToMonth

             'epoch'       => Rose::DB::Object::Metadata::Column::Epoch
             'epoch hires' => Rose::DB::Object::Metadata::Column::Epoch::HiRes

             array     => Rose::DB::Object::Metadata::Column::Array
             set       => Rose::DB::Object::Metadata::Column::Set

             chkpass   => Rose::DB::Object::Metadata::Column::Pg::Chkpass

       column_type_names
           Returns  the list (in list context) or reference to an array (in scalar context) of registered column
           type names.

       convention_manager_class NAME [, CLASS]
           Given the string NAME, return  the  name  of  the  Rose::DB::Object::ConventionManager-derived  class
           mapped to that name.

           If a CLASS is passed, then NAME is mapped to CLASS.

       convention_manager_classes [MAP]
           Get or set the hash that maps names to Rose::DB::Object::ConventionManager-derived class names.

           This  hash  is  class  data.   If  you  want  to  modify  it,  I  suggest making your own subclass of
           Rose::DB::Object::Metadata and then setting that as the meta_class of your Rose::DB::Object subclass.

           If passed MAP (a list of name/class pairs or a reference to a hash of the same) then MAP replaces the
           current mapping.  Returns a list of name/class pairs (in list context) or a reference to the hash  of
           name/class mappings (in scalar context).

           The default mapping of names to classes is:

             default => Rose::DB::Object::ConventionManager
             null    => Rose::DB::Object::ConventionManager::Null

       dbi_prepare_cached [BOOL]
           Get  or set a boolean value that indicates whether or not the Rose::DB::Object-derived class will use
           DBI's prepare_cached method by default (instead of the prepare  method)  when  loading,  saving,  and
           deleting objects.  The default value is true.

       default_column_undef_overrides_default [BOOL]
           Get or set the default value of the column_undef_overrides_default attribute.  Defaults to undef.

       default_manager_base_class [CLASS]
           Get  or  set the default name of the base class used by this metadata class when generating a manager
           classes.  The default value is "Rose::DB::Object::Manager".  See  the  "default_manager_base_class()"
           object method to override this value for a specific metadata object.

       for_class CLASS
           Returns  (or  creates, if needed) the single Rose::DB::Object::Metadata object associated with CLASS,
           where CLASS is the name of a Rose::DB::Object-derived class.

       init_column_name_to_method_name_mapper
           This class method should return a reference to a subroutine that maps column names to  method  names,
           or false if it does not want to do any custom mapping.  The default implementation returns zero (0).

           If  defined,  the  subroutine  should  take four arguments: the metadata object, the column name, the
           column method type, and the method name that would be used if the mapper subroutine  did  not  exist.
           It should return a method name.

       prime_all_caches [PARAMS]
           Call  prime_caches  on  all  registered_classes,  passing PARAMS to each call.  PARAMS are name/value
           pairs.  Valid parameters are:

           db DB
               A Rose::DB-derived object used to determine  which  data  source  the  cached  metadata  will  be
               generated  on  behalf of.  (Each data source has its own set of cached metadata.)  This parameter
               is optional.  If it is not passed, then the  Rose::DB-derived  object  returned  by  the  init_db
               method for each class will be used instead.

       relationship_type_class TYPE
           Given     the     relationship     type     string     TYPE,     return     the     name    of    the
           Rose::DB::Object::Metadata::Relationship-derived class used to store metadata and create the accessor
           method(s) for relationships of that type.

       relationship_type_classes [MAP]
           Get  or  set   the   hash   that   maps   relationship   type   strings   to   the   names   of   the
           Rose::DB::Object::Metadata::Relationship-derived  classes  used  to  store metadata and create object
           methods fetch and/or manipulate objects from foreign tables.

           This hash is class data.  If  you  want  to  modify  it,  I  suggest  making  your  own  subclass  of
           Rose::DB::Object::Metadata and then setting that as the meta_class of your Rose::DB::Object subclass.

           If passed MAP (a list of type/class pairs or a reference to a hash of the same) then MAP replaces the
           current  relationship  type  mapping.   Returns  a  list  of  type/class pairs (in list context) or a
           reference to the hash of type/class mappings (in scalar context).

           The default mapping of type names to class names is:

             'one to one'   => Rose::DB::Object::Metadata::Relationship::OneToOne
             'one to many'  => Rose::DB::Object::Metadata::Relationship::OneToMany
             'many to one'  => Rose::DB::Object::Metadata::Relationship::ManyToOne
             'many to many' => Rose::DB::Object::Metadata::Relationship::ManyToMany

       registered_classes
           Return a list (in list context) or reference to an array (in scalar context)  of  the  names  of  all
           Rose::DB::Object-derived classes registered under this metadata class's registry_key.

       registry_key
           Returns  the  string  used  to group Rose::DB::Object-derived class names in the class registry.  The
           default is "Rose::DB::Object::Metadata".

CONSTRUCTOR

       new PARAMS
           Returns (or creates, if needed) the single Rose::DB::Object::Metadata associated  with  a  particular
           Rose::DB::Object-derived  class,  modifying  or initializing it according to PARAMS, where PARAMS are
           name/value pairs.

           Any object method is a valid parameter name,  but  PARAMS  must  include  a  value  for  the  "class"
           parameter,  since  that's  how  Rose::DB::Object::Metadata  objects are mapped to their corresponding
           Rose::DB::Object-derived class.

OBJECT METHODS

       add_column ARGS
           This is an alias for the add_columns method.

       add_columns ARGS
           Add the columns specified by ARGS to the list of columns for the table.  Returns the list of  columns
           added in list context, or a reference to an array of columns added in scalar context.  Columns can be
           specified in ARGS in several ways.

           If an argument is a subclass of Rose::DB::Object::Metadata::Column, it is added as-is.

           If an argument is a plain scalar, it is taken as the name of a scalar column.  A column object of the
           class returned by the method call "$obj->column_type_class('scalar')" is constructed and then added.

           Otherwise,  only  name/value pairs are considered, where the name is taken as the column name and the
           value must be a reference to a hash.

           If the hash contains the key "primary_key" with a  true  value,  then  the  column  is  marked  as  a
           primary_key_member  and  the  column  name is added to the list of primary key columns by calling the
           add_primary_key_column method with the column name as its argument.

           If the hash contains the key "alias", then the value of that key is used as the alias for the column.
           This is a shorthand equivalent to explicitly calling the alias_column column method.

           If the hash contains the key "temp" and its value is true, then the column is actually added  to  the
           list of non-persistent columns.

           If  the  hash  contains  a  key  with  the  same name as a column trigger event type (e.g., "on_set",
           "on_load", "inflate") then the value of that key must be a code reference or a reference to an  array
           of  code references, which will be added to the list of the column's triggers for the specified event
           type.

           If the hash contains the key "methods", then its value must be a reference to an array or a reference
           to a hash.  The auto_method_types of the column are then set to the values of the  referenced  array,
           or  the  keys  of  the  referenced  hash.   The  values  of  the  referenced hash are used to set the
           method_name for their corresponding method types.

           If the hash contains the key "add_methods", then its value must be a  reference  to  an  array  or  a
           reference to a hash.  The values of the referenced array or the keys of the referenced hash are added
           to the column's auto_method_types.  The values of the referenced hash are used to set the method_name
           for their corresponding method types.

           If the "methods" and "add_methods" keys are both set, a fatal error will occur.

           Then the column_type_class method is called with the value of the "type" hash key as its argument (or
           "scalar" if that key is missing), returning the name of a column class.  Finally, a new column object
           of  that class is constructed and is passed all the remaining pairs in the hash reference, along with
           the name and type of the column.  That column object is then added to the list of columns.

           This is done until there are no more arguments to be processed, or until an argument does not conform
           to one of the required formats, in which case a fatal error occurs.

           Example:

               $meta->add_columns
               (
                 # Add a scalar column
                 'name',

                 # which is roughly equivalent to:
                 #
                 # $class = $meta->column_type_class('scalar');
                 # $col = $class->new(name => 'name');
                 # (then add $col to the list of columns)

                 # Add by name/hashref pair with explicit method types
                 age => { type => 'int', default => 5, methods => [ 'get', 'set' ] },

                 # which is roughly equivalent to:
                 #
                 # $class = $meta->column_type_class('int');
                 # $col = $class->new(name    => 'age',
                 #                    type    => 'int',
                 #                    default => 5);
                 # $col->auto_method_types('get', 'set');
                 # (then add $col to the list of columns)

                 # Add by name/hashref pair with additional method type and name
                 size => { type => 'int', add_methods => { 'set' => 'set_my_size' } },

                 # which is roughly equivalent to:
                 #
                 # $class = $meta->column_type_class('int');
                 # $col = $class->new(name    => 'size',
                 #                    type    => 'int',);
                 # $col->add_auto_method_types('set');
                 # $col->method_name(set => 'set_my_size');
                 # (then add $col to the list of columns)

                 # Add a column object directly
                 Rose::DB::Object::Metadata::Column::Date->new(
                   name => 'start_date'),
               );

       add_nonpersistent_column ARGS
           This is an alias for the add_nonpersistent_columns method.

       add_nonpersistent_columns ARGS
           This method behaves like the add_columns method, except that it adds to the  list  of  non-persistent
           columns.  See the documentation for the nonpersistent_columns method for more information.

       add_foreign_keys ARGS
           Add  foreign  keys  as specified by ARGS.  Each foreign key must have a name that is unique among all
           other foreign keys in this class.

           Foreign keys can be specified in ARGS in several ways.

           If an argument is a Rose::DB::Object::Metadata::ForeignKey object (or subclass thereof), it is  added
           as-is.

           Otherwise,  only name/value pairs are considered, where the name is taken as the foreign key name and
           the value must be a reference to a hash.

           If the hash contains the key "methods", then its value must be a reference to an array or a reference
           to a hash.  The auto_method_types of the foreign key are then set to the  values  of  the  referenced
           array,  or  the  keys  of the referenced hash.  The values of the referenced hash are used to set the
           method_name for their corresponding method types.

           If the hash contains the key "add_methods", then its value must be a  reference  to  an  array  or  a
           reference to a hash.  The values of the referenced array or the keys of the referenced hash are added
           to  the  foreign  key's  auto_method_types.   The  values  of the referenced hash are used to set the
           method_name for their corresponding method types.

           If the "methods" and "add_methods" keys are both set, a fatal error will occur.

           A new Rose::DB::Object::Metadata::ForeignKey object is constructed and is passed  all  the  remaining
           pairs  in  the  hash  reference,  along  with  the name of the foreign key as the value of the "name"
           parameter.  That foreign key object is then added to the list of foreign keys.

           This is done until there are no more arguments to be processed, or until an argument does not conform
           to one of the required formats, in which case a fatal error occurs.

           Example:

               $meta->add_foreign_keys
               (
                 # Add by name/hashref pair with explicit method type
                 category =>
                 {
                   class       => 'Category',
                   key_columns => { category_id => 'id' },
                   methods => [ 'get' ],
                 },

                 # which is roughly equivalent to:
                 #
                 # $fk = Rose::DB::Object::Metadata::ForeignKey->new(
                 #         class       => 'Category',
                 #         key_columns => { category_id => 'id' },
                 #         name        => 'category');
                 # $fk->auto_method_types('get');
                 # (then add $fk to the list of foreign keys)

                 # Add by name/hashref pair with additional method type and name
                 color =>
                 {
                   class       => 'Color',
                   key_columns => { color_id => 'id' },
                   add_methods => { set => 'set_my_color' },
                 },

                 # which is roughly equivalent to:
                 #
                 # $fk = Rose::DB::Object::Metadata::ForeignKey->new(
                 #         class       => 'Color',
                 #         key_columns => { color_id => 'id' },
                 #         name        => 'color');
                 # $fk->add_auto_method_types('set');
                 # $fk->method_name(set => 'set_my_color');
                 # (then add $fk to the list of foreign keys)

                 # Add a foreign key object directly
                 Rose::DB::Object::Metadata::ForeignKey->new(...),
               );

           For each foreign key added, a corresponding relationship with the same name is added if it  does  not
           already  exist.   The  relationship  type  is  determined  by  the  value of the foreign key object's
           relationship attribute.  The default is "many to one".  The class of the relationship  is  chosen  by
           calling relationship_type_class with the relationship type as an argument.

       add_primary_key_column COLUMN
           This method is an alias for add_primary_key_columns.

       add_primary_key_columns COLUMNS
           Add  COLUMNS to the list of columns that make up the primary key.  COLUMNS can be a list or reference
           to an array of column names.

       add_relationship ARGS
           This is an alias for the add_relationships method.

       add_relationships ARGS
           Add relationships as specified by ARGS.  Each relationship must have a name that is unique among  all
           other relationships in this class.

           Relationships can be specified in ARGS in several ways.

           If an argument is a subclass of Rose::DB::Object::Metadata::Relationship, it is added as-is.

           Otherwise, only name/value pairs are considered, where the name is taken as the relationship name and
           the value must be a reference to a hash.

           If the hash contains the key "methods", then its value must be a reference to an array or a reference
           to  a  hash.   The auto_method_types of the relationship are then set to the values of the referenced
           array, or the keys of the referenced hash.  The values of the referenced hash are  used  to  set  the
           method_name for their corresponding method types.

           If  the  hash  contains  the  key  "add_methods", then its value must be a reference to an array or a
           reference to a hash.  The values of the referenced array or the keys of the referenced hash are added
           to the relationship's auto_method_types.  The values of the referenced  hash  are  used  to  set  the
           method_name for their corresponding method types.

           If the "methods" and "add_methods" keys are both set, a fatal error will occur.

           Then  the  relationship_type_class  method  is  called  with  the value of the "type" hash key as its
           argument, returning the name of a relationship class.

           Finally, a new relationship object of that class is constructed and is passed all the remaining pairs
           in the hash reference, along with the name and type of the relationship.  That relationship object is
           then added to the list of relationships.

           This is done until there are no more arguments to be processed, or until an argument does not conform
           to one of the required formats, in which case a fatal error occurs.

           Example:

               $meta->add_relationships
               (
                 # Add by name/hashref pair with explicit method type
                 category =>
                 {
                   type       => 'many to one',
                   class      => 'Category',
                   column_map => { category_id => 'id' },
                   methods    => [ 'get' ],
                 },

                 # which is roughly equivalent to:
                 #
                 # $class = $meta->relationship_type_class('many to one');
                 # $rel = $class->new(class      => 'Category',
                 #                    column_map => { category_id => 'id' },
                 #                    name       => 'category');
                 # $rel->auto_method_types('get');
                 # (then add $rel to the list of relationships)

                 # Add by name/hashref pair with additional method type and name
                 color =>
                 {
                   type        => 'many to one',
                   class       => 'Color',
                   column_map  => { color_id => 'id' },
                   add_methods => { set => 'set_my_color' },
                 },

                 # which is roughly equivalent to:
                 #
                 # $class = $meta->relationship_type_class('many to one');
                 # $rel = $class->new(class      => 'Color',
                 #                    column_map => { color_id => 'id' },
                 #                    name       => 'color');
                 # $rel->add_auto_method_types('set');
                 # $fk->method_name(set => 'set_my_color');
                 # (rel add $fk to the list of foreign keys)

                 # Add a relationship object directly
                 Rose::DB::Object::Metadata::Relationship::OneToOne->new(...),
               );

       add_unique_key KEY
           This method is an alias for add_unique_keys.

       add_unique_keys KEYS
           Add new unique keys specified by KEYS.  Unique keys can be specified in KEYS in two ways.

           If an argument is a Rose::DB::Object::Metadata::UniqueKey object  (or  subclass  thereof),  then  its
           parent is set to the metadata object itself, and it is added.

           Otherwise,  an  argument must be a single column name or a reference to an array of column names that
           make up a unique key.  A new Rose::DB::Object::Metadata::UniqueKey is created, with its parent set to
           the metadata object itself, and then the unique key object is added to this list of unique  keys  for
           this class.

       alias_column NAME, ALIAS
           Set  the  alias  for the column named NAME to ALIAS.  It is sometimes necessary to use an alias for a
           column because the column name conflicts with an existing Rose::DB::Object method name.

           For example, imagine a column named "save".  The Rose::DB::Object API already defines a method  named
           save,  so  obviously that name can't be used for the accessor method for the "save" column.  To solve
           this, make an alias:

               $meta->alias_column(save => 'save_flag');

           See the Rose::DB::Object documentation or call the method_name_is_reserved method to determine  if  a
           method name is reserved.

       allow_inline_column_values [BOOL]
           Get  or  set  the  boolean flag that indicates whether or not the associated Rose::DB::Object-derived
           class should try to inline column values that DBI does not handle correctly when they  are  bound  to
           placeholders using bind_columns.  The default value is false.

           Enabling   this   flag   reduces  the  performance  of  the  update  and  insert  operations  on  the
           Rose::DB::Object-derived object.  But it is sometimes necessary to enable the flag because  some  DBI
           drivers  do  not  (or  cannot)  always  do the right thing when binding values to placeholders in SQL
           statements.  For example, consider the following SQL for the Informix database:

               CREATE TABLE test (d DATETIME YEAR TO SECOND);
               INSERT INTO test (d) VALUES (CURRENT);

           This is valid Informix SQL and will insert a row with the current  date  and  time  into  the  "test"
           table.

           Now  consider the following attempt to do the same thing using DBI placeholders (assume the table was
           already created as per the CREATE TABLE statement above):

               $sth = $dbh->prepare('INSERT INTO test (d) VALUES (?)');
               $sth->execute('CURRENT'); # Error!

           What you'll end up with is an error like this:

               DBD::Informix::st execute failed: SQL: -1262: Non-numeric
               character in datetime or interval.

           In other words, DBD::Informix has tried to quote the string "CURRENT", which has special  meaning  to
           Informix only when it is not quoted.

           In  order to make this work, the value "CURRENT" must be "inlined" rather than bound to a placeholder
           when it is the value of a "DATETIME YEAR TO SECOND" column in an Informix database.

       auto_load_related_classes [BOOL]
           Get or set a flag that indicates whether or not classes related to this class through a  foreign  key
           or other relationship will be automatically loaded when this class is initialized.  The default value
           is true.

       cached_objects_expire_in [DURATION]
           This    method    is   only   applicable   if   this   metadata   object   is   associated   with   a
           Rose::DB::Object::Cached-derived class.  It simply calls the class  method  of  the  same  name  that
           belongs to the Rose::DB::Object::Cached-derived class associated with this metadata object.

       catalog [CATALOG]
           Get  or  set  the  database catalog for this class.  This setting will override any setting in the db
           object.  Use this method only if you know that the class will always point  to  a  specific  catalog,
           regardless of what the Rose::DB-derived database handle object specifies.

       class [CLASS]
           Get  or  set  the  Rose::DB::Object-derived  class associated with this metadata object.  This is the
           class where the accessor methods for each column will be created (by make_methods).

       class_for PARAMS
           Returns the name of the Rose::DB::Object-derived class associated with the "catalog",  "schema",  and
           "table"  specified by the name/value paris in PARAMS.  Catalog and/or schema maybe omitted if unknown
           or inapplicable, and the "best" match will be returned.  Returns undef if  there  is  no  class  name
           registered under the specified PARAMS.

           Note:  This  method  may  also be called as a class method, but may require explicit "catalog" and/or
           "schema" arguments when dealing with databases that support these concepts and have default  implicit
           values for them.

       clear_object_cache
           This    method    is   only   applicable   if   this   metadata   object   is   associated   with   a
           Rose::DB::Object::Cached-derived class.  It simply calls the class  method  of  the  same  name  that
           belongs to the Rose::DB::Object::Cached-derived class associated with this metadata object.

       column NAME [, COLUMN | HASHREF]
           Get     or     set     the    column    named    NAME.     If    just    NAME    is    passed,    the
           Rose::DB::Object::Metadata::Column-derived column object for the column of that name is returned.  If
           no such column exists, undef is returned.

           If both NAME and COLUMN are passed, then COLUMN must be a  Rose::DB::Object::Metadata::Column-derived
           object.   COLUMN has its name set to NAME, and is then stored as the column metadata object for NAME,
           replacing any existing column.

           If both NAME and HASHREF are passed, then the combination of NAME and HASHREF must form a  name/value
           pair  suitable  for  passing to the add_columns method.  The new column specified by NAME and HASHREF
           replaces any existing column.

       columns [ARGS]
           Get or set the full list of columns.  If ARGS are passed, the column list is cleared  and  then  ARGS
           are passed to the add_columns method.

           Returns  a  list  of  column objects in list context, or a reference to an array of column objects in
           scalar context.

       column_accessor_method_name NAME
           Returns the name of the "get" method for the  column  named  NAME.   This  is  just  a  shortcut  for
           "$meta->column(NAME)->accessor_method_name".

       column_accessor_method_names
           Returns  a list (in list context) or a reference to the array (in scalar context) of the names of the
           "set" methods for all the columns, in the order that the columns are returned by column_names.

       column_aliases [MAP]
           Get or set the hash that maps column names to their aliases.  If passed MAP  (a  list  of  name/value
           pairs  or a reference to a hash) then MAP replaces the current alias mapping.  Returns a reference to
           the hash that maps column names to their aliases.

           Note that modifying this map has no effect if initialize, make_methods,  or  make_column_methods  has
           already been called for the current class.

       column_mutator_method_name NAME
           Returns  the  name  of  the  "set"  method  for  the  column named NAME.  This is just a shortcut for
           "$meta->column(NAME)->mutator_method_name".

       column_mutator_method_names
           Returns a list (in list context) or a reference to the array (in scalar context) of the names of  the
           "set" methods for all the columns, in the order that the columns are returned by column_names.

       column_names
           Returns a list (in list context) or a reference to an array (in scalar context) of column names.

       column_name_to_method_name_mapper [CODEREF]
           Get  or  set  the  code  reference  to  the subroutine used to map column names to  method names.  If
           undefined, then the  init_column_name_to_method_name_mapper  class  method  is  called  in  order  to
           initialize it.  If still undefined or false, then the "default" method name is used.

           If  defined,  the  subroutine  should  take four arguments: the metadata object, the column name, the
           column method type, and the method name that would be used if the mapper subroutine  did  not  exist.
           It should return a method name.

       column_rw_method_name NAME
           Returns  the  name  of  the  "get_set" method for the column named NAME.  This is just a shortcut for
           "$meta->column(NAME)->rw_method_name".

       column_rw_method_names
           Returns a list (in list context) or a reference to the array (in scalar context) of the names of  the
           "get_set" methods for all the columns, in the order that the columns are returned by column_names.

       column_undef_overrides_default [BOOL]
           Get or set a boolean value that influences the default value of the undef_overrides_default attribute
           for  each  column  in  this  class.   See  the documentation for Rose::DB::Object::Metadata::Column's
           undef_overrides_default attribute for more information.

           Defaults to the value returned by the default_column_undef_overrides_default class method.

       convention_manager [ OBJECT | CLASS | NAME ]
           Get  or  set  the  convention  manager  for  this  class.   Defaults  to  the  return  value  of  the
           init_convention_manager method.

           If undef is passed, then a Rose::DB::Object::ConventionManager::Null object is stored instead.

           If  a  Rose::DB::Object::ConventionManager-derived  object  is passed, its meta attribute set to this
           metadata object and then it is used as the convention manager for this class.

           If a Rose::DB::Object::ConventionManager-derived class name is passed, a new object of that class  is
           created  with  its  meta  attribute  set  to this metadata object.  Then it is used as the convention
           manager for this class.

           If a convention manager name is passed, then the corresponding class is looked up in  the  convention
           manager class map, a new object of that class is constructed, its meta attribute set to this metadata
           object,  and  it  is  used  as the convention manager for this class.  If there is no class mapped to
           NAME, a fatal error will occur.

           See  the  Rose::DB::Object::ConventionManager  documentation  for  more  information  on   convention
           managers.

       db  Returns the Rose::DB-derived object associated with this metadata object's class.  A fatal error will
           occur if class is undefined or if the Rose::DB object could not be created.

       default_cascade_save [BOOL]
           Get  or  set  a  boolean  value that indicates whether or not the class associated with this metadata
           object will save related objects when  the  parent  object  is  saved.   See  the  documentation  for
           Rose::DB::Object's save() method for details.  The default value is false.

       default_load_speculative [BOOL]
           Get  or  set  a  boolean  value that indicates whether or not the class associated with this metadata
           object will load speculatively by default.   See  the  documentation  for  Rose::DB::Object's  load()
           method for details.  The default value is false.

       default_update_changes_only [BOOL]
           Get  or  set  a  boolean  value that indicates whether or not the class associated with this metadata
           object will update only an object's modified columns by default (instead of  updating  all  columns).
           See  the  documentation  for  Rose::DB::Object's  update()  method for details.  The default value is
           false.

       delete_column NAME
           Delete the column named NAME.

       delete_columns
           Delete all of the columns.

       delete_column_type_class TYPE
           Delete the type/class mapping entry for the column type TYPE.

       delete_convention_manager_class NAME
           Delete the name/class mapping entry for the convention manager class mapped to NAME.

       delete_nonpersistent_column NAME
           Delete the non-persistent column named NAME.

       delete_nonpersistent_columns
           Delete all of the nonpersistent_columns.

       delete_relationship NAME
           Delete the relationship named NAME.

       delete_relationships
           Delete all of the relationships.

       delete_relationship_type_class TYPE
           Delete the type/class mapping entry for the relationship type TYPE.

       delete_unique_keys
           Delete all of the unique key definitions.

       error_mode [MODE]
           Get or set the  error  mode  of  the  Rose::DB::Object  that  fronts  the  table  described  by  this
           Rose::DB::Object::Metadata  object.  If the error mode is false, then it defaults to the return value
           of the "init_error_mode" method, which is "fatal" by default.

           The error mode determines what happens when a  Rose::DB::Object  method  encounters  an  error.   The
           "return"  error mode causes the methods to behave as described in the Rose::DB::Object documentation.
           All other error modes cause an action  to  be  performed  before  (possibly)  returning  as  per  the
           documentation (depending on whether or not the "action" is some variation on "throw an exception.")

           Valid values of MODE are:

           carp
               Call Carp::carp with the value of the object error as an argument.

           cluck
               Call Carp::cluck with the value of the object error as an argument.

           confess
               Call Carp::confess with the value of the object error as an argument.

           croak
               Call Carp::croak with the value of the object error as an argument.

           fatal
               An alias for the "croak" mode.

           return
               Return  a  value that indicates that an error has occurred, as described in the documentation for
               each method.

           In all cases, the object's error attribute will also contain the error message.

       first_column
           Returns the first column, determined by the order that columns were added, or undef if there  are  no
           columns.

       foreign_key NAME [, FOREIGNKEY | HASHREF ]
           Get  or set the foreign key named NAME.  NAME should be the name of the thing being referenced by the
           foreign key, not the name of any of the columns that make up the foreign key.  If called with just  a
           NAME  argument, the foreign key stored under that name is returned.  Undef is returned if there is no
           such foreign key.

           If    both    NAME    and    FOREIGNKEY    are    passed,    then    FOREIGNKEY     must     be     a
           Rose::DB::Object::Metadata::ForeignKey-derived  object.   FOREIGNKEY has its name set to NAME, and is
           then stored, replacing any existing foreign key with the same name.

           If both NAME and HASHREF are passed, then the combination of NAME and HASHREF must form a  name/value
           pair  suitable for passing to the add_foreign_keys method.  The new foreign key specified by NAME and
           HASHREF replaces any existing foreign key with the same name.

       foreign_keys [ARGS]
           Get or set the full list of foreign keys.  If ARGS are passed, the foreign key list  is  cleared  and
           then ARGS are passed to the add_foreign_keys method.

           Returns  a  list  of  foreign  key objects in list context, or a reference to an array of foreign key
           objects in scalar context.

       generate_primary_key_value DB
           This method is the same as generate_primary_key_values except that  it  only  returns  the  generated
           value  for the first primary key column, rather than the entire list of values.  Use this method only
           when there is a single primary key column (or not at all).

       generate_primary_key_values DB
           Given the Rose::DB-derived object DB, generate and return a list of new primary key column values for
           the table described by this metadata object.

           If a primary_key_generator is defined, it will be called (passed this metadata object and the DB) and
           its value returned.

           If no primary_key_generator is defined, new primary key values will be generated, if possible,  using
           the native facilities of the current database.  Note that this may not be possible for databases that
           auto-generate such values only after an insertion.  In that case, undef will be returned.

       include_predicated_unique_indexes [BOOL]
           Get or set a boolean value that indicates whether or not the auto_init_unique_keys method will create
           unique  keys  for  unique indexes that have predicates.  The default value is false.  This feature is
           currently only supported for PostgreSQL.

           Here's an example of a unique index that has a predicate:

               CREATE UNIQUE INDEX my_idx ON mytable (mycolumn) WHERE mycolumn > 123;

           The predicate in this case is "WHERE mycolumn > 123".

           Predicated unique indexes differ semantically from unpredicated unique  indexes  in  that  predicates
           generally cause the index to only  apply to part of a table.  Rose::DB::Object expects unique indexes
           to  uniquely  identify  a  row  within  a  table.  Predicated indexes that fail to do so due to their
           predicates should therefore not have Rose::DB::Object::Metadata::UniqueKey objects created for  them,
           thus the false default for this attribute.

       init_convention_manager
           Returns the default Rose::DB::Object::ConventionManager-derived object used as the convention manager
           for this class.  This object will be of the class returned by convention_manager_class('default').

           Override  this method in your Rose::DB::Object::Metadata subclass, or re-map the "default" convention
           manager class, in order to use a different convention manager class.  See the tips and tricks section
           of the Rose::DB::Object::ConventionManager documentation for an example of the subclassing approach.

       initialize [ARGS]
           Initialize the Rose::DB::Object-derived class  associated  with  this  metadata  object  by  creating
           accessor methods for each column and foreign key.  The table name and the primary_key_columns must be
           defined or a fatal error will occur.

           If  any  column  name  in  the  primary  key  or any of the unique keys does not exist in the list of
           columns, then that primary or unique key is deleted.  (As per the above, this will  trigger  a  fatal
           error if any column in the primary key is not in the column list.)

           ARGS, if any, are passed to the call to make_methods that actually creates the methods.

           If  auto_prime_caches  is  true,  then  the  prime_caches  method  will  be  called at the end of the
           initialization process.

       is_initialized [BOOL]
           Get or set a boolean value that indicates whether or not this class was  initialized.   A  successful
           call to the initialize method will automatically set this flag to true.

       make_manager_class [PARAMS | CLASS]
           This method creates a Rose::DB::Object::Manager-derived class to manage objects of this class.  To do
           so,  it  simply  calls perl_manager_class, passing all arguments, and then evaluates the result.  See
           the perl_manager_class documentation for more information.

       make_methods [ARGS]
           Create object methods in class for each column, foreign key,  and  relationship.   This  is  done  by
           calling   make_column_methods,   make_nonpersistent_column_methods,   make_foreign_key_methods,   and
           make_relationship_methods, in that order.

           ARGS are name/value pairs which are passed on to the other  "make_*_methods"  calls.   They  are  all
           optional.  Valid ARGS are:

           •   "preserve_existing"

               If  set to a true value, a method will not be created if there is already an existing method with
               the same named.

           •   "replace_existing"

               If set to a true value, override any existing method with the same name.

           In the absence of one of these parameters, any method name that conflicts  with  an  existing  method
           name will cause a fatal error.

       make_column_methods [ARGS]
           Create  accessor/mutator  methods  in  class for each column.  ARGS are name/value pairs, and are all
           optional.  Valid ARGS are:

           •   "preserve_existing"

               If set to a true value, a method will not be created if there is already an existing method  with
               the same named.

           •   "replace_existing"

               If set to a true value, override any existing method with the same name.

           For  each  auto_method_type  in each column, the method name is determined by passing the column name
           and the method type to method_name_from_column_name.   If  the  resulting  method  name  is  reserved
           (according  to method_name_is_reserved, a fatal error will occur.  The object methods for each column
           are created by calling the column object's make_methods method.

       make_foreign_key_methods [ARGS]
           Create object methods in class for each  foreign  key.   ARGS  are  name/value  pairs,  and  are  all
           optional.  Valid ARGS are:

           •   "preserve_existing"

               If  set to a true value, a method will not be created if there is already an existing method with
               the same named.

           •   "replace_existing"

               If set to a true value, override any existing method with the same name.

           For each auto_method_type in each foreign key, the method name is determined by  passing  the  method
           type to the method_name method of the foreign key object, or the build_method_name_for_type method if
           the  method_name  call  returns  a  false  value.   If  the  method  name  is  reserved (according to
           method_name_is_reserved), a fatal error will occur.  The object methods  for  each  foreign  key  are
           created by calling the foreign key  object's make_methods method.

           Foreign  keys  and  relationships  with  the  type  "one  to  one"  or "many to one" both encapsulate
           essentially the same information.  They are kept in sync when this method is called  by  setting  the
           foreign_key  attribute  of  each  "one  to  one"  or  "many  to  one"  relationship  object to be the
           corresponding foreign key object.

       make_nonpersistent_column_methods [ARGS]
           This method behaves like the make_column_methods method, except that  it  works  with  non-persistent
           columns.   See  the  documentation  for the nonpersistent_columns method for more information on non-
           persistent columns.

       make_relationship_methods [ARGS]
           Create object methods in class for each  relationship.   ARGS  are  name/value  pairs,  and  are  all
           optional.  Valid ARGS are:

           •   "preserve_existing"

               If  set to a true value, a method will not be created if there is already an existing method with
               the same named.

           •   "replace_existing"

               If set to a true value, override any existing method with the same name.

           For each auto_method_type in each relationship, the method name is determined by passing  the  method
           type  to  the method_name method of the relationship object, or the build_method_name_for_type method
           if the method_name call returns a false  value.   If  the  method  name  is  reserved  (according  to
           method_name_is_reserved),  a  fatal  error  will occur.  The object methods for each relationship are
           created by calling the relationship  object's make_methods method.

           Foreign keys and relationships with the  type  "one  to  one"  or  "many  to  one"  both  encapsulate
           essentially  the  same  information.  They are kept in sync when this method is called by setting the
           foreign_key attribute of each  "one  to  one"  or  "many  to  one"  relationship  object  to  be  the
           corresponding foreign key object.

           If  a  relationship corresponds exactly to a foreign key, and that foreign key already made an object
           method, then the relationship is not asked to make its own method.

       default_manager_base_class [CLASS]
           Get or set the default name of the base class used by this specific metadata object when generating a
           manager class, using either the perl_manager_class or make_manager_class methods.  The default  value
           is determined by the "default_manager_base_class|/default_manager_base_class()" class method.

       method_column METHOD
           Returns the name of the column manipulated by the method named METHOD.

       method_name_from_column_name NAME, TYPE
           Looks  up  the  column  named  NAME  and  calls  method_name_from_column  with the column and TYPE as
           argument.  If no such column exists, a fatal error will occur.

       method_name_from_column COLUMN, TYPE
           Given a Rose::DB::Object::Metadata::Column-derived column object and a column type name,  return  the
           corresponding  method  name that should be used for it.  Several entities are given an opportunity to
           determine the name.  They are consulted in the following order.

           1. If a custom-defined column_name_to_method_name_mapper exists, then it is used to generate the
           method name and this name is returned.
           2. If a method name has been explicitly set, for this type in the column object itself, then this
           name is returned.
           3. If the convention manager's auto_column_method_name method returns a defined value, then this name
           is returned.
           4. Otherwise, the default naming rules as defined in the column class itself are used.
       method_name_is_reserved NAME, CLASS
           Given the method name NAME and the class name CLASS, returns true if  the  method  name  is  reserved
           (i.e., is used by the CLASS API), false otherwise.

       nonpersistent_column NAME [, COLUMN | HASHREF]
           This  method  behaves  like the column method, except that it works with non-persistent columns.  See
           the documentation for  the  nonpersistent_columns  method  for  more  information  on  non-persistent
           columns.

       nonpersistent_columns [ARGS]
           Get  or  set  the full list of non-persistent columns.  If ARGS are passed, the non-persistent column
           list is cleared and then ARGS are passed to the add_nonpersistent_columns method.

           Returns a list of non-persistent column objects in list context, or a reference to an array  of  non-
           persistent column objects in scalar context.

           Non-persistent  columns  allow  the  creation  of  object  attributes and associated accessor/mutator
           methods exactly like those associated with columns, but without ever sending any of these  attributes
           to (or pulling any these attributes from) the database.

           Non-persistent  columns  are tracked entirely separately from columns.  Adding, deleting, and listing
           non-persistent columns has no affect on the list of normal (i.e., "persistent") columns.

           You cannot query the database (e.g., using Rose::DB::Object::Manager) and filter on a  non-persistent
           column;  non-persistent columns do not exist in the database.  This feature exists solely to leverage
           the method creation abilities of the various column classes.

       nonpersistent_column_accessor_method_name NAME
           Returns the name of the "get" method for the non-persistent  column  named  NAME.   This  is  just  a
           shortcut for "$meta->nonpersistent_column(NAME)->accessor_method_name".

       nonpersistent_column_accessor_method_names
           Returns  a list (in list context) or a reference to the array (in scalar context) of the names of the
           "set" methods for all the non-persistent columns, in the order  that  the  columns  are  returned  by
           nonpersistent_column_names.

       nonpersistent_column_mutator_method_name NAME
           Returns  the  name  of  the  "set"  method  for the non-persistent column named NAME.  This is just a
           shortcut for "$meta->nonpersistent_column(NAME)->mutator_method_name".

       nonpersistent_column_mutator_method_names
           Returns a list (in list context) or a reference to the array (in scalar context) of the names of  the
           "set"  methods  for  all  the  non-persistent  columns, in the order that the columns are returned by
           nonpersistent_column_names.

       nonpersistent_column_names
           Returns a list (in list context) or a reference to an array (in  scalar  context)  of  non-persistent
           column names.

       pk_columns [COLUMNS]
           This is an alias for the primary_key_columns method.

       post_init_hook [ CODEREF | ARRAYREF ]
           Get  or  set  a  reference to a subroutine or a reference to an array of code references that will be
           called just after the initialize method runs.  Each referenced subroutine will be passed the metadata
           object itself and any arguments passed to the call to initialize.

       pre_init_hook [ CODEREF | ARRAYREF ]
           Get or set a reference to a subroutine or a reference to an array of code  references  that  will  be
           called  just  before  the  initialize  method  runs.   Each  referenced subroutine will be passed the
           metadata object itself and any arguments passed to the call to initialize.

       primary_key [PK]
           Get or set the Rose::DB::Object::Metadata::PrimaryKey object that stores the  list  of  column  names
           that make up the primary key for this table.

       primary_key_columns [COLUMNS]
           Get  or  set  the  list  of columns that make up the primary key.  COLUMNS should be a list of column
           names or Rose::DB::Object::Metadata::Column-derived objects.

           Returns  all   of   the   columns   that   make   up   the   primary   key.    Each   column   is   a
           Rose::DB::Object::Metadata::Column-derived  column  object  if  a  column  object  with the same name
           exists, or just the column name otherwise.  In scalar context, a reference to an array of columns  is
           returned.  In list context, a list is returned.

           This method is just a shortcut for the code:

               $meta->primary_key->columns(...);

           See the primary_key method and the Rose::DB::Object::Metadata::PrimaryKey class for more information.

       primary_key_column_names [NAMES]
           Get  or set the names of the columns that make up the table's primary key.  NAMES should be a list or
           reference to an array of column names.

           Returns the list of column names (in list context) or a reference to the array of  column  names  (in
           scalar context).

           This method is just a shortcut for the code:

               $meta->primary_key->column_names(...);

           See the primary_key method and the Rose::DB::Object::Metadata::PrimaryKey class for more information.

       primary_key_generator [CODEREF]
           Get or set the subroutine used to generate new primary key values for the primary key columns of this
           table.   The  subroutine  will  be  passed  two  arguments:  the  current  metadata  object  and  the
           Rose::DB-derived object that points to the current database.

           The subroutine is expected to return a list of values, one for each primary key column.   The  values
           must  be  in  the same order as the corresponding columns returned by primary_key_columns. (i.e., the
           first value belongs to the first column returned by primary_key_columns, the second value belongs  to
           the second column, and so on.)

       primary_key_sequence_names [NAMES]
           Get  or  set  the  list  of  database  sequence  names used to populate the primary key columns.  The
           sequence names must be in the same order  as  the  primary_key_columns.   NAMES  may  be  a  list  or
           reference  to an array of sequence names.  Returns a list (in list context) or reference to the array
           (in scalar context) of sequence names.

           If you do not set this value, it will be derived for you  based  on  the  name  of  the  primary  key
           columns.   In  the  common case, you do not need to be concerned about this method.  If you are using
           the built-in SERIAL or AUTO_INCREMENT types in your database for your primary key columns, everything
           should just work.

       prime_caches [PARAMS]
           By default, secondary metadata derived from the attributes of this object is created  and  cached  on
           demand.  Call this method to pre-cache this metadata all at once.  This method is useful when running
           in an environment like mod_perl where it's advantageous to load as much data as possible on start-up.

           PARAMS are name/value pairs.  Valid parameters are:

           db DB
               A  Rose::DB-derived  object  used  to  determine  which  data  source the cached metadata will be
               generated on behalf of.  (Each data source has its own set of cached metadata.)   This  parameter
               is  optional.   If  it  is  not  passed, then the Rose::DB-derived object returned by the init_db
               method for this class will be used instead.

       relationship NAME [, RELATIONSHIP | HASHREF]
           Get   or   set   the    relationship    named    NAME.     If    just    NAME    is    passed,    the
           Rose::DB::Object::Metadata::Relationship-derived  relationship  object for that NAME is returned.  If
           no such relationship exists, undef is returned.

           If   both    NAME    and    RELATIONSHIP    are    passed,    then    RELATIONSHIP    must    be    a
           Rose::DB::Object::Metadata::Relationship-derived  object.  RELATIONSHIP has its name set to NAME, and
           is then stored as the relationship metadata object for NAME, replacing any existing relationship.

           If both NAME and HASHREF are passed, then the combination of NAME and HASHREF must form a  name/value
           pair  suitable  for  passing to the add_relationships method.  The new relationship specified by NAME
           and HASHREF replaces any existing relationship.

       relationships [ARGS]
           Get or set the full list of relationships.  If ARGS are passed, the relationship list is cleared  and
           then ARGS are passed to the add_relationships method.

           Returns  a  list  of relationship objects in list context, or a reference to an array of relationship
           objects in scalar context.

       replace_column NAME, [COLUMN | HASHREF]
           Replace the column named NAME with a newly constructed column.  This method is equivalent to deleting
           any existing column named NAME and then adding a new one.  In other words, this:

               $meta->replace_column($name => $value);

           is equivalent to this:

               $meta->delete_column($name);
               $meta->add_column($name => $value);

           The value of the new column may be a Rose::DB::Object::Metadata::Column-derived object or a reference
           to a hash suitable for passing to the add_columns method.

       schema [SCHEMA]
           Get or set the database schema for this class.  This setting will override  any  setting  in  the  db
           object.   Use  this  method  only  if you know that the class will always point to a specific schema,
           regardless of what the Rose::DB-derived database handle object specifies.

       setup PARAMS
           Set up all the metadata for this class in  a  single  method  call.   This  method  is  a  convenient
           shortcut.  It does its work by delegating to other methods.

           The  setup()  method  does  nothing  if  the metadata object is already initialized (according to the
           is_initialized method).

           PARAMS are method/arguments pairs.  In general, the following transformations apply.

           Given a method/arrayref pair:

               METHOD => [ ARG1, ARG2 ]

           The arguments will be removed from their array reference and passed to METHOD like this:

               $meta->METHOD(ARG1, ARG2);

           Given a method/value pair:

               METHOD => ARG

           The argument will be passed to METHOD as-is:

               $meta->METHOD(ARG);

           There are two exceptions to these transformation rules.

           If METHOD is "unique_key" or "add_unique_key" and the argument is a reference to an array  containing
           only  non-reference  values,  then  the array reference itself is passed to the method.  For example,
           this pair:

               unique_key => [ 'name', 'status' ]

           will result in this method call:

               $meta->unique_key([ 'name', 'status' ]);

           (Note that these method names are singular.  This exception does not apply to  the  plural  variants,
           "unique_keys" and "add_unique_keys".)

           If  METHOD is "helpers", then the argument is dereferenced (if it's an array reference) and passed on
           to Rose::DB::Object::Helpers.  That is, this:

               helpers => [ 'load_or_save', { load_or_insert => 'find_or_create' } ],

           Is equivalent to having this in your class:

               use Rose::DB::Object::Helpers
                 'load_or_save', { load_or_insert => 'find_or_create' };

           Method names may appear more than once in PARAMS.  The methods are called  in  the  order  that  they
           appear  in  PARAMS, with the exception of the initialize (or auto_initialize) method, which is always
           called last.

           If "initialize" is not one of the method names,  then  it  will  be  called  automatically  (with  no
           arguments)  at  the end.  If you do not want to pass any arguments to the initialize method, standard
           practice is to omit it.

           If "auto_initialize" is one of the method names, then the   auto_initialize  method  will  be  called
           instead  of  the  initialize  method.   This is useful if you want to manually set up a few pieces of
           metadata, but want the auto-initialization system to set up the rest.

           The name "auto" is considered equivalent to "auto_initialize", but any arguments are  ignored  unless
           they are encapsulated in a reference to an array.  For example, these are equivalent:

               $meta->setup(
                 table => 'mytable',
                 # Call auto_initialize() with no arguments
                 auto_initialize => [],
               );

               # This is another way of writing the same thing as the above
               $meta->setup(
                 table => 'mytable',
                 # The value "1" is ignored because it's not an arrayref,
                 # so auto_initialize() will be called with no arguments.
                 auto => 1,
               );

           Finally,  here's  a  full  example  of  a  setup() method call followed by the equivalent "long-hand"
           implementation.

               $meta->setup
               (
                 table => 'colors',

                 columns =>
                 [
                   code => { type => 'character', length => 3, not_null => 1 },
                   name => { type => 'varchar', length => 255 },
                 ],

                 primary_key_columns => [ 'code' ],

                 unique_key => [ 'name' ],
               );

           The setup() method call above is equivalent to the following code:

               unless($meta->is_initialized)
               {
                 $meta->table('colors');

                 $meta->columns(
                 [
                   code => { type => 'character', length => 3, not_null => 1 },
                   name => { type => 'varchar', length => 255 },
                 ]);

                 $meta->primary_key_columns('code');

                 $meta->unique_key([ 'name' ]),

                 $meta->initialize;
               }

       sql_qualify_column_names_on_load [BOOL]
           Get or set a boolean value that indicates whether or not to prefix the columns with the table name in
           the SQL used to load() an object.  The default value is false.

           For  example,  here  is  some  SQL  that  might  be  used  to  load  an  object,  as  generated  with
           sql_qualify_column_names_on_load set to false:

               SELECT id, name FROM dogs WHERE id = 5;

           Now here's how it would look with sql_qualify_column_names_on_load set to true:

               SELECT dogs.id, dogs.name FROM dogs WHERE dogs.id = 5;

       table [TABLE]
           Get  or  set the name of the database table.  The table name should not include any sort of prefix to
           indicate the schema or catalog.

       unique_key KEY
           This method is an alias for add_unique_keys.

       unique_keys KEYS
           Get or set the list of unique keys for this table.  If KEYS is passed,  any  existing  keys  will  be
           deleted and KEYS will be passed to the add_unique_keys method.

           Returns   the   list   (in   list   context)  or  reference  to  an  array  (in  scalar  context)  of
           Rose::DB::Object::Metadata::UniqueKey objects.

       unique_key_by_name NAME
           Return the unique key named NAME, or undef if no such key exists.

       unique_keys_column_names
           Returns a list (in list context) or a reference to an array (in  scalar  context)  or  references  to
           arrays of the column names that make up each unique key.  That is:

               # Example of a scalar context return value
               [ [ 'id', 'name' ], [ 'code' ] ]

               # Example of a list context return value
               ([ 'id', 'name' ], [ 'code' ])

AUTO-INITIALIZATION METHODS

       These  methods  are  associated with the auto-initialization process.  Calling any of them will cause the
       auto-initialization code to be loaded, which costs memory.  This should be considered  an  implementation
       detail for now.

       Regardless  of the implementation details, you should still avoid calling any of these methods unless you
       plan to do some auto-initialization.  No matter how generic they may  seem  (e.g.,  default_perl_indent),
       rest assured that none of these methods are remotely useful unless you are doing auto-initialization.

   CLASS METHODS
       default_perl_braces [STYLE]
           Get  or  set  the  default  brace style used in the Perl code generated by the perl_* object methods.
           STYLE must be either "k&r" or "bsd".  The default value is "k&r".

       default_perl_indent [INT]
           Get or set the default integer number of spaces used for each level of indenting  in  the  Perl  code
           generated by the perl_* object methods.  The default value is 4.

       default_perl_unique_key_style [STYLE]
           Get  or set the default style of the unique key initialization used in the Perl code generated by the
           perl_unique_keys_definition method.  STYLE must  be  "array"  or  "object".   The  default  value  is
           "array".  See the perl_unique_keys_definition method for examples of the two styles.

   OBJECT METHODS
       auto_generate_columns
           Auto-generate  Rose::DB::Object::Metadata::Column-derived objects for each column in the table.  Note
           that this method does not modify the metadata object's list of columns.  It simply returns a list  of
           column objects.    Calling this method in void context will cause a fatal error.

           Returns  a list of column objects (in list context) or a reference to a hash of column objects, keyed
           by column name (in scalar context).  The hash reference  return  value  is  intended  to  allow  easy
           modification of the auto-generated column objects.  Example:

               $columns = $meta->auto_generate_columns; # hash ref return value

               # Make some changes
               $columns->{'name'}->length(10); # set different length
               $columns->{'age'}->default(5);  # set different default
               ...

               # Finally, set the column list
               $meta->columns(values %$columns);

           If  you do not want to modify the auto-generated columns, you should use the auto_init_columns method
           instead.

           A fatal error will occur unless at least one column was auto-generated.

       auto_generate_foreign_keys [PARAMS]
           Auto-generate Rose::DB::Object::Metadata::ForeignKey objects for each foreign key in the table.  Note
           that this method does not modify the metadata object's list of foreign_keys.   It  simply  returns  a
           list  of  foreign  key  objects.   Calling  this  method in void context will cause a fatal error.  A
           warning will be issued if a foreign key could not be generated  because  no  Rose::DB::Object-derived
           class was found for the foreign table.

           PARAMS are optional name/value pairs.  If a "no_warnings" parameter is passed with a true value, then
           the warning described above will not be issued.

           Returns  a  list  of  foreign key objects (in list context) or a reference to an array of foreign key
           objects (in scalar context).

           If you do not want to inspect or modify the auto-generated  foreign  keys,  but  just  want  them  to
           populate  the  metadata  object's foreign_keys list, you should use the auto_init_foreign_keys method
           instead.

           Note: This method works with MySQL only when using the InnoDB storage type.

       auto_generate_unique_keys
           Auto-generate Rose::DB::Object::Metadata::UniqueKey objects for each unique key in the  table.   Note
           that this method does not modify the metadata object's list of unique_keys.  It simply returns a list
           of unique key objects.  Calling this method in void context will cause a fatal error.

           Returns  a  list  of  unique  key  objects (in list context) or a reference to an array of unique key
           objects (in scalar context).

           If you do not want to inspect or modify the  auto-generated  unique  keys,  but  just  want  them  to
           populate  the  metadata  object's  unique_keys  list, you should use the auto_init_unique_keys method
           instead.

       auto_retrieve_primary_key_column_names
           Returns a list (in list context) or a reference to an array (in scalar context) of the names  of  the
           columns  that  make  up  the  primary  key for this table.  Note that this method does not modify the
           metadata object's primary_key.  It simply returns a list of column names.   Calling  this  method  in
           void context will cause a fatal error.

           This  method  is  rarely  called explicitly.  Usually, you will use the auto_init_primary_key_columns
           method instead.

           A fatal error will occur unless at least one column name can be retrieved.

           (This method uses the word "retrieve" instead of "generate" like its sibling methods above because it
           does not generate objects; it simply returns column names.)

       auto_initialize [PARAMS]
           Auto-initialize the entire metadata object.  This is  a  wrapper  for  the  individual  "auto_init_*"
           methods, and is roughly equivalent to this:

             $meta->auto_init_columns(...);
             $meta->auto_init_primary_key_columns;
             $meta->auto_init_unique_keys(...);
             $meta->auto_init_foreign_keys(...);
             $meta->auto_init_relationships(...);
             $meta->initialize;

           PARAMS are optional name/value pairs.  When applicable, these parameters are passed on to each of the
           "auto_init_*" methods.  Valid parameters are:

           include_map_class_relationships BOOL
               By  default,  if  a  class is a map class (according to the is_map_class method of the convention
               manager), then relationships directly between that class  and  the  current  class  will  not  be
               created.  Set this parameter to true to allow such relationships to be created.

               Note:  If  some  classes  that are not actually map classes are being skipped, you should not use
               this parameter to force them to be included.  It's more  appropriate  to  make  your  own  custom
               convention  manager  subclass  and  then  override  the  is_map_class  method to make the correct
               determination.

           replace_existing BOOL
               If true, then the auto-generated columns, unique keys, foreign keys, and  relationships  entirely
               replace any existing columns, unique keys, foreign keys, and relationships, respectively.

           stay_connected BOOL
               If  true, then any database connections retained by the metadata objects belonging to the various
               Rose::DB::Object-derived classes participating in the  auto-initialization  process  will  remain
               connected until an explicit call to the clear_all_dbs class method.

           with_foreign_keys BOOL
               A  boolean  value  indicating  whether  or  not  foreign  key  metadata will be auto-initialized.
               Defaults to true.

           with_relationships [ BOOL | ARRAYREF ]
               A boolean value or a reference to an array of relationship  type  names.   If  set  to  a  simple
               boolean  value,  then  the all types of relationships will be considered for auto-initialization.
               If set to a list of relationship type names, then only  relationships  of  those  types  will  be
               considered.  Defaults to true.

           with_unique_keys BOOL
               A boolean value indicating whether or not unique key metadata will be auto-initialized.  Defaults
               to true.

           During  initialization,  if  one of the columns has a method name that clashes with a reserved method
           name, then the column_alias_generator will be called to remedy the situation by aliasing the  column.
           If the name still conflicts, then a fatal error will occur.

           A fatal error will occur if auto-initialization fails.

       auto_init_columns [PARAMS]
           Auto-generate  Rose::DB::Object::Metadata::Column  objects  for this table, then populate the list of
           columns.  PARAMS are optional name/value pairs.  If a "replace_existing" parameter is passed  with  a
           true  value,  then  the auto-generated columns replace any existing columns.  Otherwise, any existing
           columns are left as-is.

       auto_init_foreign_keys [PARAMS]
           Auto-generate Rose::DB::Object::Metadata::ForeignKey objects for this table, then populate  the  list
           of  foreign_keys.  PARAMS are optional name/value pairs.  If a "replace_existing" parameter is passed
           with a true  value,  then  the  auto-generated  foreign  keys  replace  any  existing  foreign  keys.
           Otherwise, any existing foreign keys are left as-is.

           Note: This method works with MySQL only when using the InnoDB storage type.

       auto_init_primary_key_columns
           Auto-retrieve the names of the columns that make up the primary key for this table, then populate the
           list  of  primary_key_column_names.   A fatal error will occur unless at least one primary key column
           name could be retrieved.

       auto_init_relationships [PARAMS]
           Auto-populate the list of relationships for this class.  PARAMS are optional name/value pairs.

           include_map_class_relationships BOOL
               By default, if a class is a map class (according to the is_map_class  method  of  the  convention
               manager),  then  relationships  directly  between  that  class  and the current class will not be
               created.  Set this parameter to true to allow such relationships to be created.

               Note: If some classes that are not actually map classes are being skipped,  you  should  not  use
               this  parameter  to  force  them  to  be included.  It's more appropriate to make your own custom
               convention manager subclass and then  override  the  is_map_class  method  to  make  the  correct
               determination.

           replace_existing BOOL
               If  true,  then  the auto-generated relationships replace any existing relationships.  Otherwise,
               any existing relationships are left as-is.

           relationship_types ARRAYREF
               A reference to an array of relationship type names.  Only relationships of these  types  will  be
               created.   If  omitted,  relationships of all types will be created.  If passed a reference to an
               empty array, no relationships will be created.

           types ARRAYREF
               This is an alias for the "relationship_types" parameter.

           with_relationships [ BOOL | ARRAYREF ]
               This is the same as the "relationship_types" parameter except that  it  also  accepts  a  boolean
               value.   If  true,  then relationships of all types will be created.  If false, then none will be
               created.

           Assume that this class is called "Local" and any  hypothetical  foreign  class  is  called  "Remote".
           Relationships are auto-generated according to the following rules.

           •   A  one-to-many relationship is created between "Local" and "Remote" if "Remote" has a foreign key
               that points to "Local".  This is not done, however, if  "Local"  has  a  one-to-one  relationship
               pointing  to "Remote" that references the same columns as the foreign key in "Remote" that points
               to "Local", or if "Local" is a map class (according  to  the  convention  manager's  is_map_class
               method).     The    relationship    name    is    generated    by    the   convention   manager's
               auto_relationship_name_one_to_many method.

           •   A many-to-many relationship is created between "Local" and "Remote" if there exists a  map  class
               (according  to  the  convention manager's is_map_class method) with exactly two foreign keys, one
               pointing to Local and on pointing to "Remote".  The relationship name is generated by creating  a
               plural version of the name of the foreign key in the map class that points to "Remote".

           In  all  cases, if there is an existing, semantically identical relationship, then a new relationship
           is not auto-generated.  Similarly, any existing methods with the same names  are  not  overridden  by
           methods associated with auto-generated relationships.

       auto_init_unique_keys [PARAMS]
           Auto-generate Rose::DB::Object::Metadata::UniqueKey objects for this table, then populate the list of
           unique_keys.   PARAMS  are name/value pairs.  If a "replace_existing" parameter is passed with a true
           value, then the auto-generated unique keys replace any existing unique keys.  Otherwise, any existing
           unique keys are left as-is.

       column_alias_generator [CODEREF]
           Get or set the code reference to the subroutine used to alias columns have, or would generate, one or
           more method names that clash with reserved method names.

           The subroutine should take two arguments: the metadata object and the column name.  The  $_  variable
           will  also  be set to the column name at the time of the call.  The subroutine should return an alias
           for the column.

           The default column alias generator simply appends the string "_col" to the end of the column name and
           returns that as the alias.

       foreign_key_name_generator [CODEREF]
           Get or set the code reference to the subroutine used to generate foreign key names.  Note: This  code
           will  only  be  called if the convention_manager's auto_foreign_key_name method fails to (or declines
           to) produce a defined foreign key name.

           The    subroutine    should    take    two     arguments:     a     metadata     object     and     a
           Rose::DB::Object::Metadata::ForeignKey object.  It should return a name for the foreign key.

           Each  foreign  key must have a name that is unique within the class.  By default, this name will also
           be the name of the method generated to access the object referred to by the foreign key, so  it  must
           be unique among method names in the class as well.

           The default foreign key name generator uses the following algorithm:

           If  the  foreign  key has only one column, and if the name of that column ends with an underscore and
           the name of the referenced column, then that part of the column name is  removed  and  the  remaining
           string is used as the foreign key name.  For example, given the following tables:

               CREATE TABLE categories
               (
                 id  SERIAL PRIMARY KEY,
                 ...
               );

               CREATE TABLE products
               (
                 category_id  INT REFERENCES categories (id),
                 ...
               );

           The  foreign  key name would be "category", which is the name of the referring column ("category_id")
           with an underscore and the name of the referenced column ("_id") removed from the end of it.

           If the foreign key has only one column, but it does not  meet  the  criteria  described  above,  then
           "_object"  is  appended  to  the name of the referring column and the resulting string is used as the
           foreign key name.

           If the foreign key has more than one column, then the foreign key  name  is  generated  by  replacing
           double colons and case-transitions in the referenced class name with underscores, and then converting
           to  lowercase.   For  example, if the referenced table is fronted by the class My::TableOfStuff, then
           the generated foreign key name would be "my_table_of_stuff".

           In all of the scenarios above, if the generated foreign key name  is  still  not  unique  within  the
           class,  then  a number is appended to the end of the name.  That number is incremented until the name
           is unique.

           In practice, rather than setting a custom foreign key name generator, it's usually easier  to  simply
           set  the  foreign  key  name(s) manually after auto-initializing the foreign keys (but before calling
           initialize or auto_initialize, of course).

       perl_class_definition [PARAMS]
           Auto-initialize the columns, primary key, foreign keys, and unique keys, then return the Perl  source
           code  for a complete Rose::DB::Object-derived class definition.  PARAMS are optional name/value pairs
           that may include the following:

           braces STYLE
               The brace style to use in the generated Perl code.  STYLE must be either  "k&r"  or  "bsd".   The
               default value is determined by the return value of the default_perl_braces class method.

           indent INT
               The  integer number of spaces to use for each level of indenting in the generated Perl code.  The
               default value is determined by the return value of the default_perl_indent class method.

           isa CLASSES
               The list of base classes to use in the generated class definition.  CLASSES should  be  a  single
               class   name,  or  a  reference  to  an  array  of  class  names.   The  default  base  class  is
               Rose::DB::Object.

           use_setup BOOL
               If true, then the generated class definition will include a call to the setup method.  Otherwise,
               the generated code will contain individual methods calls.  The default value for  this  parameter
               is true; the setup method is the recommended way to initialize a class.

           This  method is simply a wrapper (with some glue) for the following methods: perl_columns_definition,
           perl_primary_key_columns_definition, perl_unique_keys_definition,  perl_foreign_keys_definition,  and
           perl_relationships_definition.   The  "braces"  and  "indent" parameters are passed on to these other
           methods.

           Here's a complete example, which also serves as an example of the individual  "perl_*"  methods  that
           this method wraps.  First, the table definitions.

               CREATE TABLE topics
               (
                 id    SERIAL PRIMARY KEY,
                 name  VARCHAR(32)
               );

               CREATE TABLE codes
               (
                 k1    INT NOT NULL,
                 k2    INT NOT NULL,
                 k3    INT NOT NULL,
                 name  VARCHAR(32),

                 PRIMARY KEY(k1, k2, k3)
               );

               CREATE TABLE products
               (
                 id             SERIAL PRIMARY KEY,
                 name           VARCHAR(32) NOT NULL,
                 flag           BOOLEAN NOT NULL DEFAULT 't',
                 status         VARCHAR(32) DEFAULT 'active',
                 topic_id       INT REFERENCES topics (id),
                 fk1            INT,
                 fk2            INT,
                 fk3            INT,
                 last_modified  TIMESTAMP,
                 date_created   TIMESTAMP,

                 FOREIGN KEY (fk1, fk2, fk3) REFERENCES codes (k1, k2, k3)
               );

               CREATE TABLE prices
               (
                 id          SERIAL PRIMARY KEY,
                 product_id  INT REFERENCES products (id),
                 price       DECIMAL(10,2) NOT NULL DEFAULT 0.00,
                 region      CHAR(2) NOT NULL DEFAULT 'US'
               );

           First we'll auto-initialize the classes.

               package Code;
               use base qw(Rose::DB::Object);
               __PACKAGE__->meta->auto_initialize;

               package Category;
               use base qw(Rose::DB::Object);
               # Explicit table name required because the class name
               # does not match up with the table name in this case.
               __PACKAGE__->meta->table('topics');
               __PACKAGE__->meta->auto_initialize;

               package Product;
               use base qw(Rose::DB::Object);
               __PACKAGE__->meta->auto_initialize;

               package Price;
               use base qw(Rose::DB::Object);
               __PACKAGE__->meta->auto_initialize;

           Now we'll print the "Product" class definition;

               print Product->meta->perl_class_definition(braces => 'bsd',
                                                          indent => 2);

           The output looks like this:

             package Product;

             use strict;

             use base qw(Rose::DB::Object);

             __PACKAGE__->meta->setup
             (
               table => 'products',

               columns =>
               [
                 id            => { type => 'integer', not_null => 1 },
                 name          => { type => 'varchar', length => 32, not_null => 1 },
                 flag          => { type => 'boolean', default => 'true', not_null => 1 },
                 status        => { type => 'varchar', default => 'active', length => 32 },
                 topic_id      => { type => 'integer' },
                 fk1           => { type => 'integer' },
                 fk2           => { type => 'integer' },
                 fk3           => { type => 'integer' },
                 last_modified => { type => 'timestamp' },
                 date_created  => { type => 'timestamp' },
               ],

               primary_key_columns => [ 'id' ],

               foreign_keys =>
               [
                 code =>
                 {
                   class => 'Code',
                   key_columns =>
                   {
                     fk1 => 'k1',
                     fk2 => 'k2',
                     fk3 => 'k3',
                   },
                 },

                 topic =>
                 {
                   class => 'Category',
                   key_columns =>
                   {
                     topic_id => 'id',
                   },
                 },
               ],

               relationships =>
               [
                 prices =>
                 {
                   class       => 'Price',
                   key_columns => { id => 'product_id' },
                   type        => 'one to many',
                 },
               ],
             );

             1;

           Here's the output when the "use_setup" parameter is explicitly set to false.

               print Product->meta->perl_class_definition(braces    => 'bsd',
                                                          indent    => 2,
                                                          use_setup => 0);

           Note that this approach is not recommended, but exists for historical reasons.

             package Product;

             use strict;

             use base qw(Rose::DB::Object);

             __PACKAGE__->meta->table('products');

             __PACKAGE__->meta->columns
             (
               id            => { type => 'integer', not_null => 1 },
               name          => { type => 'varchar', length => 32, not_null => 1 },
               flag          => { type => 'boolean', default => 'true', not_null => 1 },
               status        => { type => 'varchar', default => 'active', length => 32 },
               topic_id      => { type => 'integer' },
               fk1           => { type => 'integer' },
               fk2           => { type => 'integer' },
               fk3           => { type => 'integer' },
               last_modified => { type => 'timestamp' },
               date_created  => { type => 'timestamp' },
             );

             __PACKAGE__->meta->primary_key_columns([ 'id' ]);

             __PACKAGE__->meta->foreign_keys
             (
               code =>
               {
                 class => 'Code',
                 key_columns =>
                 {
                   fk1 => 'k1',
                   fk2 => 'k2',
                   fk3 => 'k3',
                 },
               },

               topic =>
               {
                 class => 'Category',
                 key_columns =>
                 {
                   topic_id => 'id',
                 },
               },
             );

             __PACKAGE__->meta->relationships
             (
               prices =>
               {
                 class       => 'Price',
                 key_columns => { id => 'product_id' },
                 type        => 'one to many',
               },
             );

             __PACKAGE__->meta->initialize;

             1;

           See the auto-initialization section for more discussion of Perl code generation.

       perl_columns_definition [PARAMS]
           Auto-initialize  the  columns  (if necessary), then return the Perl source code that is equivalent to
           the auto-initialization.  PARAMS are optional name/value pairs that may include the following:

           braces STYLE
               The brace style to use in the generated Perl code.  STYLE must be either  "k&r"  or  "bsd".   The
               default value is determined by the return value of the default_perl_braces class method.

           for_setup BOOL
               If  true,  then  the  generated  Perl  code will be a method/arguments pair suitable for use as a
               parameter to setup method.  The default is false.

           indent INT
               The integer number of spaces to use for each level of indenting in the generated Perl code.   The
               default value is determined by the return value of the default_perl_indent class method.

           To  see  examples  of  the  generated  code,  look in the documentation for the perl_class_definition
           method.

       perl_foreign_keys_definition [PARAMS]
           Auto-initialize the foreign keys (if necessary), then return the Perl source code that is  equivalent
           to the auto-initialization.  PARAMS are optional name/value pairs that may include the following:

           braces STYLE
               The  brace  style  to  use in the generated Perl code.  STYLE must be either "k&r" or "bsd".  The
               default value is determined by the return value of the default_perl_braces class method.

           for_setup BOOL
               If true, then the generated Perl code will be a method/arguments  pair  suitable  for  use  as  a
               parameter to setup method.  The default is false.

           indent INT
               The  integer number of spaces to use for each level of indenting in the generated Perl code.  The
               default value is determined by the return value of the default_perl_indent class method.

           To see examples of the generated code,  look  in  the  documentation  for  the  perl_class_definition
           method.

       perl_manager_class [ PARAMS | BASE_NAME ]
           Returns  a  Perl  class definition for a Rose::DB::Object::Manager-derived class to manage objects of
           this class.  If a single string is passed, it is taken as the value  of  the  "base_name"  parameter.
           PARAMS are optional name/value pairs that may include the following:

           base_name NAME
               The   value   of   the   base_name   parameter   that   will   be   passed   to   the   call   to
               Rose::DB::Object::Manager's make_manager_methods method.  Defaults to the  return  value  of  the
               convention manager's auto_manager_base_name method.

           class CLASS
               The  name  of  the  manager  class.   Defaults  to  the  return value of the convention manager's
               auto_manager_class_name method.

           isa [ LIST | ARRAYREF ]
               The name of a single class or a reference to an array of class names to be included in  the  @ISA
               array  for  the manager class.  One of these classes must inherit from Rose::DB::Object::Manager.
               Defaults to the return value of the "default_manager_base_class()" object method.

           For example, given this class:

               package Product;

               use Rose::DB::Object;
               our @ISA = qw(Rose::DB::Object);
               ...

               print Product->meta->perl_manager_class(
                                      class     => 'Prod::Mgr',
                                      base_name => 'prod');

           The following would be printed:

               package Prod::Mgr;

               use Rose::DB::Object::Manager;
               our @ISA = qw(Rose::DB::Object::Manager);

               sub object_class { 'Product' }

               __PACKAGE__->make_manager_methods('prod');

               1;

       perl_primary_key_columns_definition
           Auto-initialize the primary key column names (if necessary), then return the Perl source code that is
           equivalent to the auto-initialization.

           See the larger example in the documentation for the perl_class_definition  method  to  see  what  the
           generated Perl code looks like.

       perl_relationships_definition [PARAMS]
           Auto-initialize the relationships (if necessary), then return the Perl source code that is equivalent
           to the auto-initialization.  PARAMS are optional name/value pairs that may include the following:

           braces STYLE
               The  brace  style  to  use in the generated Perl code.  STYLE must be either "k&r" or "bsd".  The
               default value is determined by the return value of the default_perl_braces class method.

           for_setup BOOL
               If true, then the generated Perl code will be a method/arguments  pair  suitable  for  use  as  a
               parameter to setup method.  The default is false.

           indent INT
               The  integer number of spaces to use for each level of indenting in the generated Perl code.  The
               default value is determined by the return value of the default_perl_indent class method.

           To see examples of the generated code,  look  in  the  documentation  for  the  perl_class_definition
           method.

       perl_table_definition [PARAMS]
           Auto-initialize the table name (if necessary), then return the Perl source code that is equivalent to
           the auto-initialization.  PARAMS are optional name/value pairs that may include the following:

           braces STYLE
               The  brace  style  to  use in the generated Perl code.  STYLE must be either "k&r" or "bsd".  The
               default value is determined by the return value of the default_perl_braces class method.

           for_setup BOOL
               If true, then the generated Perl code will be a method/arguments  pair  suitable  for  use  as  a
               parameter to setup method.  The default is false.

           indent INT
               The  integer number of spaces to use for each level of indenting in the generated Perl code.  The
               default value is determined by the return value of the default_perl_indent class method.

           To see examples of the generated code,  look  in  the  documentation  for  the  perl_class_definition
           method.

       perl_unique_keys_definition [PARAMS]
           Auto-initialize  the  unique  keys,  then return the Perl source code that is equivalent to the auto-
           initialization.  PARAMS are optional name/value pairs that may include the following:

           braces STYLE
               The brace style to use in the generated Perl code.  STYLE must be either  "k&r"  or  "bsd".   The
               default value is determined by the return value of the default_perl_braces class method.

           for_setup BOOL
               If  true,  then  the  generated  Perl  code will be a method/arguments pair suitable for use as a
               parameter to setup method.  The default is false.

           indent INT
               The integer number of spaces to use for each level of indenting in the generated Perl code.   The
               default value is determined by the return value of the default_perl_indent class method.

           style STYLE
               Determines  the  style the initialization used in the generated Perl code.  STYLE must be "array"
               or  "object".   The  default  is  determined  by  the  return   value   of   the   class   method
               default_perl_unique_key_style.

               The "array" style passes references to arrays of column names:

                 __PACKAGE__->meta->unique_keys
                 (
                   [ 'id', 'name' ],
                   [ 'flag', 'status' ],
                 );

               The  "object"  style  sets  unique  keys using calls to the Rose::DB::Object::Metadata::UniqueKey
               constructor:

                 __PACKAGE__->meta->unique_keys
                 (
                   Rose::DB::Object::Metadata::UniqueKey->new(
                     name    => 'products_id_key',
                     columns => [ 'id', 'name' ]),

                   Rose::DB::Object::Metadata::UniqueKey->new(
                     name    => 'products_flag_key',
                     columns => [ 'flag', 'status' ]),
                 );

AUTHOR

       John C. Siracusa (siracusa@gmail.com)

LICENSE

       Copyright (c) 2010 by John C. Siracusa.  All rights reserved.  This program is  free  software;  you  can
       redistribute it and/or modify it under the same terms as Perl itself.

perl v5.36.0                                       2022-10-14                    Rose::DB::Object::Metadata(3pm)