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

NAME

       Rose::DB::Object::MakeMethods::Generic - Create generic object methods for Rose::DB::Object-derived
       objects.

SYNOPSIS

         package MyDBObject;

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

         use Rose::DB::Object::MakeMethods::Generic
         (
           scalar =>
           [
             'type' =>
             {
               with_init => 1,
               check_in  => [ qw(AA AAA C D) ],
             },

             'set_type' => { hash_key => 'type' },
           ],

           character =>
           [
             code => { length => 6 }
           ],

           varchar =>
           [
             name => { length => 10 }
           ],

           boolean =>
           [
             'is_red',
             'is_happy' => { default => 1 },
           ],
         );

         sub init_type { 'C' }
         ...

         $obj = MyDBObject->new(...);

         print $obj->type; # C

         $obj->name('Bob');   # set
         $obj->set_type('C'); # set
         $obj->type('AA');    # set

         $obj->set_type; # Fatal error: no argument passed to "set" method

         $obj->name('C' x 40); # truncate on set
         print $obj->name;     # 'CCCCCCCCCC'

         $obj->code('ABC'); # pad on set
         print $obj->code;  # 'ABC   '

         eval { $obj->type('foo') }; # fatal error: invalid value

         print $obj->name, ' is ', $obj->type; # get

         $obj->is_red;         # returns undef
         $obj->is_red('true'); # returns 1 (assuming "true" a
                               # valid boolean literal according to
                               # $obj->db->parse_boolean('true'))
         $obj->is_red('');     # returns 0
         $obj->is_red;         # returns 0

         $obj->is_happy;       # returns 1

         ...

         package Person;

         our @ISA = qw(Rose::DB::Object);
         ...
         use Rose::DB::Object::MakeMethods::Generic
         (
           scalar => 'name',

           set =>
           [
             'nicknames',
             'parts' => { default => [ qw(arms legs) ] },
           ],

           # See the Rose::DB::Object::Metadata::Relationship::ManyToMany
           # documentation for a more complete example
           objects_by_map =>
           [
             friends =>
             {
               map_class    => 'FriendMap',
               manager_args => { sort_by => Friend->meta->table . '.name' },
             },
           ],
         );
         ...

         @parts = $person->parts; # ('arms', 'legs')
         $parts = $person->parts; # [ 'arms', 'legs' ]

         $person->nicknames('Jack', 'Gimpy');   # set with list
         $person->nicknames([ 'Slim', 'Gip' ]); # set with array ref

         print join(', ', map { $_->name } $person->friends);
         ...

         package Program;

         our @ISA = qw(Rose::DB::Object);
         ...
         use Rose::DB::Object::MakeMethods::Generic
         (
           objects_by_key =>
           [
             bugs =>
             {
               class => 'Bug',
               key_columns =>
               {
                 # Map Program column names to Bug column names
                 id      => 'program_id',
                 version => 'version',
               },
               manager_args =>
               {
                 sort_by => Bug->meta->table . '.date_submitted DESC',
               },
               query_args   => [ state => { ne => 'closed' } ],
             },
           ]
         );
         ...

         $prog = Program->new(id => 5, version => '3.0', ...);

         $bugs = $prog->bugs;

         # Calls (essentially):
         #
         # Rose::DB::Object::Manager->get_objects(
         #   db           => $prog->db, # share_db defaults to true
         #   object_class => 'Bug',
         #   query =>
         #   {
         #     program_id => 5,     # value of $prog->id
         #     version    => '3.0', # value of $prog->version
         #     state      => { ne => 'closed' },
         #   },
         #   sort_by => 'date_submitted DESC');

         ...

         package Product;

         our @ISA = qw(Rose::DB::Object);
         ...
         use Rose::DB::Object::MakeMethods::Generic
         (
           object_by_key =>
           [
             category =>
             {
               class => 'Category',
               key_columns =>
               {
                 # Map Product column names to Category column names
                 category_id => 'id',
               },
             },
           ]
         );
         ...

         $product = Product->new(id => 5, category_id => 99);

         $category = $product->category;

         # $product->category call is roughly equivalent to:
         #
         # $cat = Category->new(id => $product->category_id,
         #                      db => $prog->db);
         #
         # $ret = $cat->load;
         # return $ret  unless($ret);
         # return $cat;

DESCRIPTION

       Rose::DB::Object::MakeMethods::Generic is a method maker that inherits from Rose::Object::MakeMethods.
       See the Rose::Object::MakeMethods documentation to learn about the interface.  The method types provided
       by this module are described below.

       All method types defined by this module are designed to work with objects that are subclasses of (or
       otherwise conform to the interface of) Rose::DB::Object.  In particular, the object is expected to have a
       db method that returns a Rose::DB-derived object.  See the Rose::DB::Object documentation for more
       details.

METHODS TYPES

       array
           Create  get/set  methods  for  "array" attributes.   A "array" column in a database table contains an
           ordered list of values.  Not all databases support  an  "array"  column  type.   Check  the  Rose::DB
           documentation for your database type.

           Options
               default VALUE
                   Determines the default value of the attribute.  The value should be a reference to an array.

               hash_key NAME
                   The  key  inside the hash-based object to use for the storage of this attribute.  Defaults to
                   the name of the method.

               interface NAME
                   Choose the interface.  The default is "get_set".

           Interfaces
               get_set
                   Creates a get/set method for a "array" object attribute.  A  "array"  column  in  a  database
                   table contains an ordered list of values.

                   When  setting  the  attribute,  the  value  is  passed  through the parse_array method of the
                   object's db attribute.

                   When saving to the database, if the attribute value is defined,  the  method  will  pass  the
                   attribute value through the format_array method of the object's db attribute before returning
                   it.

                   When  not  saving to the database, the method returns the array as a list in list context, or
                   as a reference to the array in scalar context.

               get Creates an accessor method for a "array" object attribute.  A "array" column  in  a  database
                   table contains an ordered list of values.

                   When  saving  to  the  database,  if the attribute value is defined, the method will pass the
                   attribute value through the format_array method of the object's db attribute before returning
                   it.

                   When not saving to the database, the method returns the array as a list in list  context,  or
                   as a reference to the array in scalar context.

               set Creates  a  mutator  method  for  a "array" object attribute.  A "array" column in a database
                   table contains an ordered list of values.

                   When setting the attribute, the value  is  passed  through  the  parse_array  method  of  the
                   object's db attribute.

                   When  saving  to  the  database,  if the attribute value is defined, the method will pass the
                   attribute value through the format_array method of the object's db attribute before returning
                   it.

                   When not saving to the database, the method returns the array as a list in list  context,  or
                   as a reference to the array in scalar context.

                   If called with no arguments, a fatal error will occur.

           Example:

               package Person;

               our @ISA = qw(Rose::DB::Object);
               ...
               use Rose::DB::Object::MakeMethods::Generic
               (
                 array =>
                 [
                   'nicknames',
                   set_nicks => { interface => 'set', hash_key => 'nicknames' },
                   parts     => { default => [ qw(arms legs) ] },
                 ],
               );
               ...

               @parts = $person->parts; # ('arms', 'legs')
               $parts = $person->parts; # [ 'arms', 'legs' ]

               $person->nicknames('Jack', 'Gimpy');   # set with list
               $person->nicknames([ 'Slim', 'Gip' ]); # set with array ref

               $person->set_nicks('Jack', 'Gimpy');   # set with list
               $person->set_nicks([ 'Slim', 'Gip' ]); # set with array ref

       bitfield
           Create get/set methods for bitfield attributes.

           Options
               default VALUE
                   Determines the default value of the attribute.

               hash_key NAME
                   The  key  inside the hash-based object to use for the storage of this attribute.  Defaults to
                   the name of the method.

               interface NAME
                   Choose the interface.  The default is "get_set".

               intersects NAME
                   Set the name of the "intersects" method.  (See "with_intersects"  below.)   Defaults  to  the
                   bitfield attribute method name with "_intersects" appended.

               bits INT
                   The number of bits in the bitfield.  Defaults to 32.

               with_intersects BOOL
                   This option is only applicable with the "get_set" interface.

                   If  true,  create  an  "intersects"  helper  method in addition to the "get_set" method.  The
                   intersection method name will be the attribute method name with  "_intersects"  appended,  or
                   the value of the "intersects" option, if it is passed.

                   The  "intersects"  method will return true if there is any intersection between its arguments
                   and the value of the bitfield attribute (i.e., if Bit::Vector's Intersection method returns a
                   value greater than zero), false (but defined) otherwise.  Its argument is passed through  the
                   parse_bitfield  method  of  the  object's  db attribute before being tested for intersection.
                   Returns undef if the bitfield is not defined.

           Interfaces
               get_set
                   Creates a get/set method for a bitfield attribute.  When setting the attribute, the value  is
                   passed through the parse_bitfield method of the object's db attribute before being assigned.

                   When  saving  to  the  database,  the  method  will  pass  the  attribute  value  through the
                   format_bitfield method of the object's db attribute  before  returning  it.   Otherwise,  the
                   value is returned as-is.

               get Creates an accessor method for a bitfield attribute.  When saving to the database, the method
                   will pass the attribute value through the format_bitfield method of the object's db attribute
                   before returning it.  Otherwise, the value is returned as-is.

               set Creates  a mutator method for a bitfield attribute.  When setting the attribute, the value is
                   passed through the parse_bitfield method of the object's db attribute before being assigned.

                   When saving  to  the  database,  the  method  will  pass  the  attribute  value  through  the
                   format_bitfield  method  of  the  object's  db attribute before returning it.  Otherwise, the
                   value is returned as-is.

                   If called with no arguments, a fatal error will occur.

           Example:

               package MyDBObject;

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

               use Rose::DB::Object::MakeMethods::Generic
               (
                 bitfield =>
                 [
                   'flags' => { size => 32, default => 2 },
                   'bits'  => { size => 16, with_intersects => 1 },
                 ],
               );

               ...

               print $o->flags->to_Bin; # 00000000000000000000000000000010

               $o->bits('101');

               $o->bits_intersects('100'); # true
               $o->bits_intersects('010'); # false

       boolean
           Create get/set methods for boolean attributes.

           Options
               default VALUE
                   Determines the default value of the attribute.

               hash_key NAME
                   The key inside the hash-based object to use for the storage of this attribute.   Defaults  to
                   the name of the method.

               interface NAME
                   Choose the interface.  The default is "get_set".

           Interfaces
               get_set
                   Creates  a  get/set method for a boolean attribute.  When setting the attribute, if the value
                   is "true" according to Perl's rules, it is compared to a list  of  "common"  true  and  false
                   values:  1,  0,  1.0  (with any number of zeros), 0.0 (with any number of zeros), t, true, f,
                   false, yes, no.  (All are case-insensitive.)  If the value matches, then it is  set  to  true
                   (1) or false (0) accordingly.

                   If  the value does not match any of those, then it is passed through the parse_boolean method
                   of the object's db attribute.  If parse_boolean returns true  (1)  or  false  (0),  then  the
                   attribute  is set accordingly.  If parse_boolean returns undef, a fatal error will occur.  If
                   the value is "false" according to Perl's rules, the attribute is set to zero (0).

                   When saving  to  the  database,  the  method  will  pass  the  attribute  value  through  the
                   format_boolean method of the object's db attribute before returning it.  Otherwise, the value
                   is returned as-is.

               get Creates  an accessor method for a boolean attribute.  When saving to the database, the method
                   will pass the attribute value through the format_boolean method of the object's db  attribute
                   before returning it.  Otherwise, the value is returned as-is.

               set Creates  a  mutator method for a boolean attribute.  When setting the attribute, if the value
                   is "true" according to Perl's rules, it is compared to a list  of  "common"  true  and  false
                   values:  1,  0,  1.0  (with any number of zeros), 0.0 (with any number of zeros), t, true, f,
                   false, yes, no.  (All are case-insensitive.)  If the value matches, then it is  set  to  true
                   (1) or false (0) accordingly.

                   If  the value does not match any of those, then it is passed through the parse_boolean method
                   of the object's db attribute.  If parse_boolean returns true  (1)  or  false  (0),  then  the
                   attribute  is set accordingly.  If parse_boolean returns undef, a fatal error will occur.  If
                   the value is "false" according to Perl's rules, the attribute is set to zero (0).

                   If called with no arguments, a fatal error will occur.

           Example:

               package MyDBObject;

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

               use Rose::DB::Object::MakeMethods::Generic
               (
                 boolean =>
                 [
                   'is_red',
                   'is_happy'  => { default => 1 },
                   'set_happy' => { interface => 'set', hash_key => 'is_happy' },
                 ],
               );

               $obj->is_red;         # returns undef
               $obj->is_red('true'); # returns 1 (assuming "true" a
                                     # valid boolean literal according to
                                     # $obj->db->parse_boolean('true'))
               $obj->is_red('');     # returns 0
               $obj->is_red;         # returns 0

               $obj->is_happy;       # returns 1
               $obj->set_happy(0);   # returns 0
               $obj->is_happy;       # returns 0

       character
           Create get/set methods for fixed-length character string attributes.

           Options
               check_in ARRAYREF
                   A reference to an array of valid values.  When setting the attribute, if the new value is not
                   equal (string comparison) to one of the valid values, a fatal error will occur.

               default VALUE
                   Determines the default value of the attribute.

               hash_key NAME
                   The key inside the hash-based object to use for the storage of this attribute.   Defaults  to
                   the name of the method.

               init_method NAME
                   The  name  of  the  method  to  call  when  initializing the value of an undefined attribute.
                   Defaults to the method name with the prefix "init_" added.  This option implies "with_init".

               interface NAME
                   Choose the interface.  The default is "get_set".

               length INT
                   The number of characters in the string.  Any strings shorter than this will  be  padded  with
                   spaces  to  meet  the  length  requirement.   If  length  is omitted, the string will be left
                   unmodified.

               overflow BEHAVIOR
                   Determines the behavior when the value is greater than the number of characters specified  by
                   the "length" option.  Valid values for BEHAVIOR are:

                   fatal
                       Throw an exception.

                   truncate
                       Truncate the value to the correct length.

                   warn
                       Print a warning message.

               with_init BOOL
                   Modifies  the behavior of the "get_set" and "get" interfaces.  If the attribute is undefined,
                   the method specified by the "init_method" option is called and the attribute is  set  to  the
                   return value of that method.

           Interfaces
               get_set
                   Creates  a  get/set  method for a fixed-length character string attribute.  When setting, any
                   strings longer than "length" will be truncated, and any strings shorter will be  padded  with
                   spaces  to  meet  the  length  requirement.   If "length" is omitted, the string will be left
                   unmodified.

               get Creates an accessor method for a fixed-length character string attribute.

               set Creates a mutator method for a fixed-length character string attribute.  Any  strings  longer
                   than  "length"  will be truncated, and any strings shorter will be padded with spaces to meet
                   the length requirement.  If "length" is omitted, the string will be left unmodified.

           Example:

               package MyDBObject;

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

               use Rose::DB::Object::MakeMethods::Generic
               (
                 character =>
                 [
                   'name' => { length => 3 },
                 ],
               );

               ...

               $o->name('John'); # truncates on set
               print $o->name;   # 'Joh'

               $o->name('A'); # pads on set
               print $o->name;   # 'A  '

       enum
           Create get/set methods for enum attributes.

           Options
               default VALUE
                   Determines the default value of the attribute.

               values ARRAYREF
                   A reference to an array of the enum values.  This attribute is required.   When  setting  the
                   attribute,  if  the  new  value is not equal (string comparison) to one of the enum values, a
                   fatal error will occur.

               hash_key NAME
                   The key inside the hash-based object to use for the storage of this attribute.   Defaults  to
                   the name of the method.

               init_method NAME
                   The  name  of  the  method  to  call  when  initializing the value of an undefined attribute.
                   Defaults to the method name with the prefix "init_" added.  This option implies "with_init".

               interface NAME
                   Choose the interface.  The "get_set" interface is the default.

               with_init BOOL
                   Modifies the behavior of the "get_set" and "get" interfaces.  If the attribute is  undefined,
                   the  method  specified  by the "init_method" option is called and the attribute is set to the
                   return value of that method.

           Interfaces
               get_set
                   Creates a get/set method for an enum attribute.  When called with an argument, the  value  of
                   the  attribute is set.  If the value is invalid, a fatal error will occur.  The current value
                   of the attribute is returned.

               get Creates an accessor method for an object attribute that returns  the  current  value  of  the
                   attribute.

               set Creates a mutator method for an object attribute.  When called with an argument, the value of
                   the  attribute is set.  If the value is invalid, a fatal error will occur.  If called with no
                   arguments, a fatal error will occur.

           Example:

               package MyDBObject;

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

               use Rose::DB::Object::MakeMethods::Generic
               (
                 enum =>
                 [
                   type  => { values => [ qw(main aux extra) ], default => 'aux' },
                   stage => { values => [ qw(new std old) ], with_init => 1 },
                 ],
               );

               sub init_stage { 'new' }
               ...

               $o = MyDBObject->new(...);

               print $o->type;   # aux
               print $o->stage;  # new

               $o->type('aux');  # set
               $o->stage('old'); # set

               eval { $o->type('foo') }; # fatal error: invalid value

               print $o->type, ' is at stage ', $o->stage; # get

       integer
           Create get/set methods for integer attributes.

           Options
               default VALUE
                   Determines the default value of the attribute.

               hash_key NAME
                   The key inside the hash-based object to use for the storage of this attribute.   Defaults  to
                   the name of the method.

               init_method NAME
                   The  name  of  the  method  to  call  when  initializing the value of an undefined attribute.
                   Defaults to the method name with the prefix "init_" added.  This option implies "with_init".

               interface NAME
                   Choose the interface.  The "get_set" interface is the default.

               with_init BOOL
                   Modifies the behavior of the "get_set" and "get" interfaces.  If the attribute is  undefined,
                   the  method  specified  by the "init_method" option is called and the attribute is set to the
                   return value of that method.

           Interfaces
               get_set
                   Creates a get/set method for an integer object attribute.  When called with an argument,  the
                   value of the attribute is set.  The current value of the attribute is returned.

               get Creates  an accessor method for an integer object attribute that returns the current value of
                   the attribute.

               set Creates a mutator method for an integer object attribute.  When called with an argument,  the
                   value of the attribute is set.  If called with no arguments, a fatal error will occur.

           Example:

               package MyDBObject;

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

               use Rose::DB::Object::MakeMethods::Generic
               (
                 integer =>
                 [
                   code => { default => 99  },
                   type => { with_init => 1 }
                 ],
               );

               sub init_type { 123 }
               ...

               $o = MyDBObject->new(...);

               print $o->code; # 99
               print $o->type; # 123

               $o->code(8675309); # set
               $o->type(42);      # set

       objects_by_key
           Create get/set methods for an array of Rose::DB::Object-derived objects fetched based on a key formed
           from attributes of the current object.

           Options
               class CLASS
                   The  name of the Rose::DB::Object-derived class of the objects to be fetched.  This option is
                   required.

               hash_key NAME
                   The key inside the hash-based object to use for the storage of the fetched objects.  Defaults
                   to the name of the method.

               key_columns HASHREF
                   A reference to a hash that maps column names in the current object to those in the objects to
                   be fetched.  This option is required.

               manager_args HASHREF
                   A reference to a hash of arguments passed to the "manager_class" when fetching  objects.   If
                   "manager_class" defaults to Rose::DB::Object::Manager, the following argument is added to the
                   "manager_args"  hash: "object_class => CLASS", where CLASS is the value of the "class" option
                   (see above).  If "manager_args" includes a "sort_by" argument, be sure to prefix each  column
                   name with the appropriate table name.  (See the synopsis for examples.)

               manager_class CLASS
                   The  name  of  the  Rose::DB::Object::Manager-derived  class  used to fetch the objects.  The
                   "manager_method"   class    method    is    called    on    this    class.     Defaults    to
                   Rose::DB::Object::Manager.

               manager_method NAME
                   The  name  of  the  class  method  to  call on "manager_class" in order to fetch the objects.
                   Defaults to "get_objects".

               manager_count_method NAME
                   The name of the class method to call on  "manager_class"  in  order  to  count  the  objects.
                   Defaults to "get_objects_count".

               interface NAME
                   Choose the interface.  The "get_set" interface is the default.

               relationship OBJECT
                   The  Rose::DB::Object::Metadata::Relationship  object  that describes the "key" through which
                   the "objects_by_key" are fetched.  This is required when using the "add_now",  "add_on_save",
                   and "get_set_on_save" interfaces.

               share_db BOOL
                   If  true,  the  db attribute of the current object is shared with all of the objects fetched.
                   Defaults to true.

               query_args ARRAYREF
                   A reference to an array of arguments added to the value of the "query"  parameter  passed  to
                   the call to "manager_class"'s "manager_method" class method.

           Interfaces
               count
                   Creates  a  method that will attempt to count Rose::DB::Object-derived objects based on a key
                   formed from attributes of the current object, plus any additional parameters  passed  to  the
                   method  call.   Note  that  this method counts the objects in the database at the time of the
                   call.  This may be different than the number of objects attached to  the  current  object  or
                   otherwise in memory.

                   Since the objects counted are partially determined by the arguments passed to the method, the
                   count is not retained.  It is simply returned.  Each call counts the specified objects again,
                   even if the arguments are the same as the previous call.

                   If the first argument is a reference to a hash or array, it is converted to a reference to an
                   array  (if  necessary)  and  taken  as the value of the "query" parameter.  All arguments are
                   passed on to the "manager_class"'s "manager_count_method" method, augmented by the key formed
                   from attributes of the current object.  Query parameters are added to the  existing  contents
                   of  the  "query"  parameter.   Other  parameters  replace existing parameters if the existing
                   values are simple scalars,  or  augment  existing  parameters  if  the  existing  values  are
                   references to hashes or arrays.

                   The  count  may fail for several reasons.  The count will not even be attempted if any of the
                   key attributes in the current object are undefined.  Instead, undef (in scalar context) or an
                   empty  list  (in  list  context)  will  be  returned.   If  the  call  to   "manager_class"'s
                   "manager_count_method"  method  returns  undef,  the  behavior  is determined by the metadata
                   object's error_mode.  If the mode is "return", that false value (in  scalar  context)  or  an
                   empty list (in list context) is returned.

                   If  the  count succeeds, the number is returned.  (If the count finds zero objects, the count
                   will be 0.  This is still considered success.)

               find
                   Creates a method that will attempt to fetch Rose::DB::Object-derived objects based on  a  key
                   formed  from  attributes  of the current object, plus any additional parameters passed to the
                   method call.  Since the objects fetched are partially determined by the arguments  passed  to
                   the  method,  the list of objects is not retained.  It is simply returned.  Each call fetches
                   the requested objects again, even if the arguments are the same as the previous call.

                   If the first argument is a reference to a hash or array, it is converted to a reference to an
                   array (if necessary) and taken as the value of the  "query"  parameter.   All  arguments  are
                   passed  on to the "manager_class"'s "manager_method" method, augmented by the key formed from
                   attributes of the current object.  Query parameters are added to the existing contents of the
                   "query" parameter.  Other parameters replace existing parameters if the existing  values  are
                   simple  scalars,  or  augment  existing  parameters  if the existing values are references to
                   hashes or arrays.

                   The fetch may fail for several reasons.  The fetch will not even be attempted if any  of  the
                   key attributes in the current object are undefined.  Instead, undef (in scalar context) or an
                   empty   list  (in  list  context)  will  be  returned.   If  the  call  to  "manager_class"'s
                   "manager_method" method returns false, the behavior is determined by  the  metadata  object's
                   error_mode.   If  the mode is "return", that false value (in scalar context) or an empty list
                   (in list context) is returned.

                   If the fetch succeeds, a list (in list context) or a reference to the array  of  objects  (in
                   scalar  context)  is returned.  (If the fetch finds zero objects, the list or array reference
                   will simply be empty.  This is still considered success.)

               iterator
                   Behaves just like find but returns an iterator rather than an array or arrayref.

               get_set
                   Creates a method that will attempt to fetch Rose::DB::Object-derived objects based on  a  key
                   formed from attributes of the current object.

                   If  passed  a  single  argument  of undef, the "hash_key" used to store the objects is set to
                   undef.  Otherwise, the argument(s) must be a list or reference to an array  containing  items
                   in one or more of the following formats:

                   •   An object of type "class".

                   •   A reference to a hash containing method name/value pairs.

                   •   A single scalar primary key value.

                   The latter two formats will be used to construct an object of type "class".  A single primary
                   key  value  is  only  a  valid argument format if the "class" in question has a single-column
                   primary key.  A hash reference argument must contain sufficient information for the object to
                   be uniquely identified.

                   The list of object is assigned to "hash_key".  Note that these objects are not added  to  the
                   database.  Use the "get_set_now" or "get_set_on_save" interface to do that.

                   If  called  with  no arguments and the hash key used to store the list of objects is defined,
                   the list (in list context) or a reference to that array (in scalar  context)  of  objects  is
                   returned.  Otherwise, the objects are fetched.

                   The  fetch  may fail for several reasons.  The fetch will not even be attempted if any of the
                   key attributes in the current object are undefined.  Instead, undef (in scalar context) or an
                   empty  list  (in  list  context)  will  be  returned.   If  the  call  to   "manager_class"'s
                   "manager_method"  method  returns  false, the behavior is determined by the metadata object's
                   error_mode.  If the mode is "return", that false value (in scalar context) or an  empty  list
                   (in list context) is returned.

                   If  the  fetch  succeeds, a list (in list context) or a reference to the array of objects (in
                   scalar context) is returned.  (If the fetch finds zero objects, the list or  array  reference
                   will simply be empty.  This is still considered success.)

               get_set_now
                   Creates  a  method that will attempt to fetch Rose::DB::Object-derived objects based on a key
                   formed from attributes of the current object, and will also save the objects to the  database
                   when  called  with arguments.  The objects do not have to already exist in the database; they
                   will be inserted if needed.

                   If passed a single argument of undef, the list of objects is set to undef, causing it  to  be
                   reloaded the next time the method is called with no arguments.  (Pass a reference to an empty
                   array  to  cause  all  of the existing objects to be deleted from the database.)  Any pending
                   "set_on_save" or "add_on_save" actions are discarded.

                   Otherwise, the argument(s) must be a list or reference to an array containing items in one or
                   more of the following formats:

                   •   An object of type "class".

                   •   A reference to a hash containing method name/value pairs.

                   •   A single scalar primary key value.

                   The latter two formats will be used to construct an object of type "class".  A single primary
                   key value is only a valid argument format if the "class"  in  question  has  a  single-column
                   primary key.  A hash reference argument must contain sufficient information for the object to
                   be uniquely identified.

                   The  list of object is assigned to "hash_key", the old objects are deleted from the database,
                   and the new ones are added to the  database.   Any  pending  "set_on_save"  or  "add_on_save"
                   actions are discarded.

                   When  adding  each  object, if the object does not already exists in the database, it will be
                   inserted.  If the object was previously loaded from or saved to  the  database,  it  will  be
                   updated.  Otherwise, it will be loaded.

                   The  parent  object  must have been loaded or saved prior to setting the list of objects.  If
                   this method is called with arguments before the object has been  loaded  or  saved,  a  fatal
                   error will occur.

                   If  called  with  no arguments and the hash key used to store the list of objects is defined,
                   the list (in list context) or a reference to that array (in scalar  context)  of  objects  is
                   returned.  Otherwise, the objects are fetched.

                   The  fetch  may fail for several reasons.  The fetch will not even be attempted if any of the
                   key attributes in the current object are undefined.  Instead, undef (in scalar context) or an
                   empty  list  (in  list  context)  will  be  returned.   If  the  call  to   "manager_class"'s
                   "manager_method"  method  returns  false, the behavior is determined by the metadata object's
                   error_mode.  If the mode is "return", that false value (in scalar context) or an  empty  list
                   (in list context) is returned.

                   If  the  fetch  succeeds, a list (in list context) or a reference to the array of objects (in
                   scalar context) is returned.  (If the fetch finds zero objects, the list or  array  reference
                   will simply be empty.  This is still considered success.)

               get_set_on_save
                   Creates  a  method that will attempt to fetch Rose::DB::Object-derived objects based on a key
                   formed from attributes of the current object, and will also save the objects to the  database
                   when the "parent" object is saved.  The objects do not have to already exist in the database;
                   they will be inserted if needed.

                   If  passed  a single argument of undef, the list of objects is set to undef, causing it to be
                   reloaded the next time the method is called with no arguments.  (Pass a reference to an empty
                   array to cause all of the existing objects to be deleted from the database when the parent is
                   saved.)

                   Otherwise, the argument(s) must be a list or reference to an array containing items in one or
                   more of the following formats:

                   •   An object of type "class".

                   •   A reference to a hash containing method name/value pairs.

                   •   A single scalar primary key value.

                   The latter two formats will be used to construct an object of type "class".  A single primary
                   key value is only a valid argument format if the "class"  in  question  has  a  single-column
                   primary key.  A hash reference argument must contain sufficient information for the object to
                   be uniquely identified.

                   The  list  of  object is assigned to "hash_key".  The old objects are scheduled to be deleted
                   from the database and the new ones are scheduled to be added to the database when the  parent
                   is saved.  Any pending "set_on_save" or "add_on_save" actions are discarded.

                   When  adding  each  object when the parent is saved, if the object does not already exists in
                   the database, it will be inserted.  If the object was previously loaded from or saved to  the
                   database, it will be updated.  Otherwise, it will be loaded.

                   If  called  with  no arguments and the hash key used to store the list of objects is defined,
                   the list (in list context) or a reference to that array (in scalar  context)  of  objects  is
                   returned.  Otherwise, the objects are fetched.

                   The  fetch  may fail for several reasons.  The fetch will not even be attempted if any of the
                   key attributes in the current object are undefined.  Instead, undef (in scalar context) or an
                   empty  list  (in  list  context)  will  be  returned.   If  the  call  to   "manager_class"'s
                   "manager_method"  method  returns  false, the behavior is determined by the metadata object's
                   error_mode.  If the mode is "return", that false value (in scalar context) or an  empty  list
                   (in list context) is returned.

                   If  the  fetch  succeeds, a list (in list context) or a reference to the array of objects (in
                   scalar context) is returned.  (If the fetch finds zero objects, the list or  array  reference
                   will simply be empty.  This is still considered success.)

               add_now
                   Creates a method that will add to a list of Rose::DB::Object-derived objects that are related
                   to  the current object by a key formed from attributes of the current object.  The objects do
                   not have to already exist in the database; they will be inserted if needed.

                   This method returns the list of objects added when called in list context, and the number  of
                   objects  added  when  called  in  scalar context.  If one or more objects could not be added,
                   undef (in scalar context) or an empty list (in list  context)  is  returned  and  the  parent
                   object's error attribute is set.

                   If  passed  an empty list, the method does nothing and the parent object's error attribute is
                   set.

                   If passed any arguments, the parent object must have been loaded or saved prior to adding  to
                   the  list  of  objects.  If this method is called with a non-empty list as an argument before
                   the parent object has been  loaded or saved, a fatal error will occur.

                   The argument(s) must be a list or reference to an array containing items in one  or  more  of
                   the following formats:

                   •   An object of type "class".

                   •   A reference to a hash containing method name/value pairs.

                   •   A single scalar primary key value.

                   The latter two formats will be used to construct an object of type "class".  A single primary
                   key  value  is  only  a  valid argument format if the "class" in question has a single-column
                   primary key.  A hash reference argument must contain sufficient information for the object to
                   be uniquely identified.

                   These objects are linked to the parent object (by setting the appropriate key attributes) and
                   then added to the database.

                   When adding each object, if the object does not already exists in the database,  it  will  be
                   inserted.   If  the  object  was  previously loaded from or saved to the database, it will be
                   updated.  Otherwise, it will be loaded.

                   The parent object's list of related objects is then set to undef, causing the related objects
                   to be reloaded from the database the next time they're needed.

               add_on_save
                   Creates a method that will add to a list of Rose::DB::Object-derived objects that are related
                   to the current object by a key formed from attributes of the  current  object.   The  objects
                   will  be  added  to the database when the parent object is saved.  The objects do not have to
                   already exist in the database; they will be inserted if needed.

                   This method returns the list of objects to be added when called  in  list  context,  and  the
                   number of items to be added when called in scalar context.

                   If  passed  an empty list, the method does nothing and the parent object's error attribute is
                   set.

                   Otherwise, the argument(s) must be a list or reference to an array containing items in one or
                   more of the following formats:

                   •   An object of type "class".

                   •   A reference to a hash containing method name/value pairs.

                   •   A single scalar primary key value.

                   The latter two formats will be used to construct an object of type "class".  A single primary
                   key value is only a valid argument format if the "class"  in  question  has  a  single-column
                   primary key.  A hash reference argument must contain sufficient information for the object to
                   be uniquely identified.

                   These  objects  are  linked  to the parent object (by setting the appropriate key attributes,
                   whether or not they're defined in the parent object) and are scheduled to  be  added  to  the
                   database when the parent object is saved.  They are also added to the parent object's current
                   list of related objects, if the list is defined at the time of the call.

                   When  adding  each  object when the parent is saved, if the object does not already exists in
                   the database, it will be inserted.  If the object was previously loaded from or saved to  the
                   database, it will be updated.  Otherwise, it will be loaded.

           Example setup:

               # CLASS     DB TABLE
               # -------   --------
               # Program   programs
               # Bug       bugs

               package Program;

               our @ISA = qw(Rose::DB::Object);
               ...
               # You will almost never call the method-maker directly
               # like this.  See the Rose::DB::Object::Metadata docs
               # for examples of more common usage.
               use Rose::DB::Object::MakeMethods::Generic
               (
                 objects_by_key =>
                 [
                   find_bugs =>
                   {
                     interface => 'find',
                     class     => 'Bug',
                     key_columns =>
                     {
                       # Map Program column names to Bug column names
                       id      => 'program_id',
                       version => 'version',
                     },
                     manager_args => { sort_by => 'date_submitted DESC' },
                   },

                   bugs =>
                   {
                     interface => '...', # get_set, get_set_now, get_set_on_save
                     class     => 'Bug',
                     key_columns =>
                     {
                       # Map Program column names to Bug column names
                       id      => 'program_id',
                       version => 'version',
                     },
                     manager_args => { sort_by => 'date_submitted DESC' },
                     query_args   => { state => { ne => 'closed' } },
                   },

                   add_bugs =>
                   {
                     interface => '...', # add_now or add_on_save
                     class     => 'Bug',
                     key_columns =>
                     {
                       # Map Program column names to Bug column names
                       id      => 'program_id',
                       version => 'version',
                     },
                     manager_args => { sort_by => 'date_submitted DESC' },
                     query_args   => { state => { ne => 'closed' } },
                   },
                 ]
               );
               ...

           Example - find interface:

               # Read from the programs table
               $prog = Program->new(id => 5)->load;

               # Read from the bugs table
               $bugs = $prog->find_bugs;

               # Calls (essentially):
               #
               # Rose::DB::Object::Manager->get_objects(
               #   db           => $prog->db, # share_db defaults to true
               #   object_class => 'Bug',
               #   query =>
               #   [
               #     program_id => 5,     # value of $prog->id
               #     version    => '3.0', # value of $prog->version
               #   ],
               #   sort_by => 'date_submitted DESC');

               # Augment query
               $bugs = $prog->find_bugs({ state => 'open' });

               # Calls (essentially):
               #
               # Rose::DB::Object::Manager->get_objects(
               #   db           => $prog->db, # share_db defaults to true
               #   object_class => 'Bug',
               #   query =>
               #   [
               #     program_id => 5,     # value of $prog->id
               #     version    => '3.0', # value of $prog->version
               #     state      => 'open',
               #   ],
               #   sort_by => 'date_submitted DESC');
               ...

               # Augment query and replace sort_by value
               $bugs = $prog->find_bugs(query   => [ state => 'defunct' ],
                                        sort_by => 'name');

               # Calls (essentially):
               #
               # Rose::DB::Object::Manager->get_objects(
               #   db           => $prog->db, # share_db defaults to true
               #   object_class => 'Bug',
               #   query =>
               #   [
               #     program_id => 5,     # value of $prog->id
               #     version    => '3.0', # value of $prog->version
               #     state      => 'defunct',
               #   ],
               #   sort_by => 'name');
               ...

           Example - get_set interface:

               # Read from the programs table
               $prog = Program->new(id => 5)->load;

               # Read from the bugs table
               $bugs = $prog->bugs;

               # Calls (essentially):
               #
               # Rose::DB::Object::Manager->get_objects(
               #   db           => $prog->db, # share_db defaults to true
               #   object_class => 'Bug',
               #   query =>
               #   [
               #     program_id => 5,     # value of $prog->id
               #     version    => '3.0', # value of $prog->version
               #     state      => { ne => 'closed' },
               #   ],
               #   sort_by => 'date_submitted DESC');
               ...
               $prog->version($new_version); # Does not hit the db
               $prog->bugs(@new_bugs);       # Does not hit the db

               # @new_bugs can contain any mix of these types:
               #
               # @new_bugs =
               # (
               #   123,                 # primary key value
               #   { id => 456 },       # method name/value pairs
               #   Bug->new(id => 789), # object
               # );

               # Write to the programs table only.  The bugs table is not
               # updated. See the get_set_now and get_set_on_save method
               # types for ways to write to the bugs table.
               $prog->save;

           Example - get_set_now interface:

               # Read from the programs table
               $prog = Program->new(id => 5)->load;

               # Read from the bugs table
               $bugs = $prog->bugs;

               $prog->name($new_name); # Does not hit the db

               # Writes to the bugs table, deleting existing bugs and
               # replacing them with @new_bugs (which must be an array
               # of Bug objects, either existing or new)
               $prog->bugs(@new_bugs);

               # @new_bugs can contain any mix of these types:
               #
               # @new_bugs =
               # (
               #   123,                 # primary key value
               #   { id => 456 },       # method name/value pairs
               #   Bug->new(id => 789), # object
               # );

               # Write to the programs table
               $prog->save;

           Example - get_set_on_save interface:

               # Read from the programs table
               $prog = Program->new(id => 5)->load;

               # Read from the bugs table
               $bugs = $prog->bugs;

               $prog->name($new_name); # Does not hit the db
               $prog->bugs(@new_bugs); # Does not hit the db

               # @new_bugs can contain any mix of these types:
               #
               # @new_bugs =
               # (
               #   123,                 # primary key value
               #   { id => 456 },       # method name/value pairs
               #   Bug->new(id => 789), # object
               # );

               # Write to the programs table and the bugs table, deleting any
               # existing bugs and replacing them with @new_bugs (which must be
               # an array of Bug objects, either existing or new)
               $prog->save;

           Example - add_now interface:

               # Read from the programs table
               $prog = Program->new(id => 5)->load;

               # Read from the bugs table
               $bugs = $prog->bugs;

               $prog->name($new_name); # Does not hit the db

               # Writes to the bugs table, adding @new_bugs to the current
               # list of bugs for this program
               $prog->add_bugs(@new_bugs);

               # @new_bugs can contain any mix of these types:
               #
               # @new_bugs =
               # (
               #   123,                 # primary key value
               #   { id => 456 },       # method name/value pairs
               #   Bug->new(id => 789), # object
               # );

               # Read from the bugs table, getting the full list of bugs,
               # including the ones that were added above.
               $bugs = $prog->bugs;

               # Write to the programs table only
               $prog->save;

           Example - add_on_save interface:

               # Read from the programs table
               $prog = Program->new(id => 5)->load;

               # Read from the bugs table
               $bugs = $prog->bugs;

               $prog->name($new_name);      # Does not hit the db
               $prog->add_bugs(@new_bugs);  # Does not hit the db
               $prog->add_bugs(@more_bugs); # Does not hit the db

               # @new_bugs and @more_bugs can contain any mix of these types:
               #
               # @new_bugs =
               # (
               #   123,                 # primary key value
               #   { id => 456 },       # method name/value pairs
               #   Bug->new(id => 789), # object
               # );

               # Write to the programs table and the bugs table, adding
               # @new_bugs to the current list of bugs for this program
               $prog->save;

       objects_by_map
           Create    methods    that    fetch    Rose::DB::Object-derived    objects    via    an   intermediate
           Rose::DB::Object-derived class that maps between two other Rose::DB::Object-derived classes.  See the
           Rose::DB::Object::Metadata::Relationship::ManyToMany documentation for a  more  complete  example  of
           this type of method in action.

           Options
               hash_key NAME
                   The key inside the hash-based object to use for the storage of the fetched objects.  Defaults
                   to the name of the method.

               interface NAME
                   Choose the interface.  The "get_set" interface is the default.

               manager_args HASHREF
                   A  reference  to a hash of arguments passed to the "manager_class" when fetching objects.  If
                   "manager_args" includes a "sort_by" argument, be sure to prefix each  column  name  with  the
                   appropriate table name.  (See the synopsis for examples.)

               manager_class CLASS
                   The  name  of  the  Rose::DB::Object::Manager-derived  class that the "map_class" will use to
                   fetch records.  Defaults to Rose::DB::Object::Manager.

               manager_method NAME
                   The name of the class method to call on  "manager_class"  in  order  to  fetch  the  objects.
                   Defaults to "get_objects".

               manager_count_method NAME
                   The  name  of  the  class  method  to  call on "manager_class" in order to count the objects.
                   Defaults to "get_objects_count".

               map_class CLASS
                   The  name  of  the  Rose::DB::Object-derived  class  that  maps   between   the   other   two
                   Rose::DB::Object-derived  classes.   This  class must have a foreign key and/or "many to one"
                   relationship for each of the two tables that it maps between.

               map_from NAME
                   The name of the "many to one" relationship or foreign key in "map_class" that points  to  the
                   object  of  the class that this relationship exists in.  Setting this value is only necessary
                   if the "map_class" has more than one foreign key or "many to one" relationship that points to
                   one of the classes that it maps between.

               map_to NAME
                   The name of the "many to one" relationship or foreign key in "map_class" that points  to  the
                   "foreign"  object to be fetched.  Setting this value is only necessary if the "map_class" has
                   more than one foreign key or "many to one" relationship that points to  one  of  the  classes
                   that it maps between.

               relationship OBJECT
                   The  Rose::DB::Object::Metadata::Relationship  object  that describes the "key" through which
                   the "objects_by_key" are fetched.  This option is required.

               share_db BOOL
                   If true, the db attribute of the current object is shared with all of  the  objects  fetched.
                   Defaults to true.

               query_args ARRAYREF
                   A  reference  to  an array of arguments added to the value of the "query" parameter passed to
                   the call to "manager_class"'s "manager_method" class method.

           Interfaces
               count
                   Creates a method that will attempt to count Rose::DB::Object-derived objects that are related
                   to the current object through the "map_class", plus any additional parameters passed  to  the
                   method  call.   Note  that  this method counts the objects in the database at the time of the
                   call.  This may be different than the number of objects attached to  the  current  object  or
                   otherwise in memory.

                   Since the objects counted are partially determined by the arguments passed to the method, the
                   count is not retained.  It is simply returned.  Each call counts the specified objects again,
                   even if the arguments are the same as the previous call.

                   If the first argument is a reference to a hash or array, it is converted to a reference to an
                   array  (if  necessary)  and  taken  as the value of the "query" parameter.  All arguments are
                   passed on to the "manager_class"'s "manager_count_method" method, augmented by the mapping to
                   the current object.  Query parameters are added to  the  existing  contents  of  the  "query"
                   parameter.   Other  parameters  replace existing parameters if the existing values are simple
                   scalars, or augment existing parameters if the existing values are references  to  hashes  or
                   arrays.

                   The  count  may fail for several reasons.  The count will not even be attempted if any of the
                   key attributes in the current object are undefined.  Instead, undef (in scalar context) or an
                   empty  list  (in  list  context)  will  be  returned.   If  the  call  to   "manager_class"'s
                   "manager_count_method"  method  returns  undef,  the  behavior  is determined by the metadata
                   object's error_mode.  If the mode is "return", that false value (in  scalar  context)  or  an
                   empty list (in list context) is returned.

                   If  the  count succeeds, the number is returned.  (If the count finds zero objects, the count
                   will be 0.  This is still considered success.)

               find
                   Creates a method that will attempt to fetch Rose::DB::Object-derived that are related to  the
                   current  object  through the "map_class", plus any additional parameters passed to the method
                   call.  Since the objects fetched are partially determined by  the  arguments  passed  to  the
                   method,  the  list of objects is not retained.  It is simply returned.  Each call fetches the
                   requested objects again, even if the arguments are the same as the previous call.

                   If the first argument is a reference to a hash or array, it is converted to a reference to an
                   array (if necessary) and taken as the value of the  "query"  parameter.   All  arguments  are
                   passed  on  to the "manager_class"'s "manager_method" method, augmented by the mapping to the
                   current object.  Query  parameters  are  added  to  the  existing  contents  of  the  "query"
                   parameter.   Other  parameters  replace existing parameters if the existing values are simple
                   scalars, or augment existing parameters if the existing values are references  to  hashes  or
                   arrays.

                   The  fetch  may fail for several reasons.  The fetch will not even be attempted if any of the
                   key attributes in the current object are undefined.  Instead, undef (in scalar context) or an
                   empty  list  (in  list  context)  will  be  returned.   If  the  call  to   "manager_class"'s
                   "manager_method"  method  returns  false, the behavior is determined by the metadata object's
                   error_mode.  If the mode is "return", that false value (in scalar context) or an  empty  list
                   (in list context) is returned.

                   If  the  fetch  succeeds, a list (in list context) or a reference to the array of objects (in
                   scalar context) is returned.  (If the fetch finds zero objects, the list or  array  reference
                   will simply be empty.  This is still considered success.)

               iterator
                   Behaves just like find but returns an iterator rather than an array or arrayref.

               get_set
                   Creates a method that will attempt to fetch Rose::DB::Object-derived objects that are related
                   to the current object through the "map_class".

                   If  passed  a  single  argument  of undef, the "hash_key" used to store the objects is set to
                   undef.  Otherwise, the argument(s) must be a list or reference to an array  containing  items
                   in one or more of the following formats:

                   •   An object of type "class".

                   •   A reference to a hash containing method name/value pairs.

                   •   A single scalar primary key value.

                   The latter two formats will be used to construct an object of type "class".  A single primary
                   key  value  is  only  a  valid argument format if the "class" in question has a single-column
                   primary key.  A hash reference argument must contain sufficient information for the object to
                   be uniquely identified.

                   The list of object is assigned to "hash_key".  Note that these objects are not added  to  the
                   database.  Use the "get_set_now" or "get_set_on_save" interface to do that.

                   If  called  with  no arguments and the hash key used to store the list of objects is defined,
                   the list (in list context) or a reference to that array (in scalar  context)  of  objects  is
                   returned.  Otherwise, the objects are fetched.

                   When  fetching  objects  from the database, if the call to "manager_class"'s "manager_method"
                   method returns false, that false value (in scalar context) or an empty list (in list context)
                   is returned.

                   If the fetch succeeds, a list (in list context) or a reference to the array  of  objects  (in
                   scalar  context)  is returned.  (If the fetch finds zero objects, the list or array reference
                   will simply be empty.  This is still considered success.)

               get_set_now
                   Creates a method that will attempt to fetch Rose::DB::Object-derived objects that are related
                   to the current object through the "map_class", and will also save objects to the database and
                   map them to the parent object when called with arguments.  The objects do not have to already
                   exist in the database; they will be inserted if needed.

                   If passed a single argument of undef, the list of objects is set to undef, causing it  to  be
                   reloaded the next time the method is called with no arguments.  (Pass a reference to an empty
                   array  to  cause all of the existing objects to be "unmapped"--that is, to have their entries
                   in the mapping table deleted from the database.)  Any pending "set_on_save" or  "add_on_save"
                   actions are discarded.

                   Otherwise, the argument(s) must be a list or reference to an array containing items in one or
                   more of the following formats:

                   •   An object of type "class".

                   •   A reference to a hash containing method name/value pairs.

                   •   A single scalar primary key value.

                   The latter two formats will be used to construct an object of type "class".  A single primary
                   key  value  is  only  a  valid argument format if the "class" in question has a single-column
                   primary key.  A hash reference argument must contain sufficient information for the object to
                   be uniquely identified.

                   The list of object is assigned to "hash_key", the old entries are deleted  from  the  mapping
                   table  in  the  database,  and  the  new  objects are added to the database, along with their
                   corresponding mapping entries.   Any  pending  "set_on_save"  or  "add_on_save"  actions  are
                   discarded.

                   When  adding  each  object, if the object does not already exists in the database, it will be
                   inserted.  If the object was previously loaded from or saved to  the  database,  it  will  be
                   updated.  Otherwise, it will be loaded.

                   The  parent  object  must have been loaded or saved prior to setting the list of objects.  If
                   this method is called with arguments before the object has been  loaded  or  saved,  a  fatal
                   error will occur.

                   If  called  with  no arguments and the hash key used to store the list of objects is defined,
                   the list (in list context) or a reference to that array (in scalar  context)  of  objects  is
                   returned.  Otherwise, the objects are fetched.

                   When  fetching,  if the call to "manager_class"'s "manager_method" method returns false, that
                   false value (in scalar context) or an empty list (in list context) is returned.

                   If the fetch succeeds, a list (in list context) or a reference to the array  of  objects  (in
                   scalar  context)  is returned.  (If the fetch finds zero objects, the list or array reference
                   will simply be empty.  This is still considered success.)

               get_set_on_save
                   Creates a method that will attempt to fetch Rose::DB::Object-derived objects that are related
                   to the current object through the "map_class", and will also save objects to the database and
                   map them to the parent object when the "parent" object is saved.  The objects do not have  to
                   already exist in the database; they will be inserted if needed.

                   If  passed  a single argument of undef, the list of objects is set to undef, causing it to be
                   reloaded the next time the method is called with no arguments.  (Pass a reference to an empty
                   array to cause all of the existing objects to be "unmapped"--that is, to have  their  entries
                   in  the mapping table deleted from the database.)  Any pending "set_on_save" or "add_on_save"
                   actions are discarded.

                   Otherwise, the argument(s) must be a list or reference to an array containing items in one or
                   more of the following formats:

                   •   An object of type "class".

                   •   A reference to a hash containing method name/value pairs.

                   •   A single scalar primary key value.

                   The latter two formats will be used to construct an object of type "class".  A single primary
                   key value is only a valid argument format if the "class"  in  question  has  a  single-column
                   primary key.  A hash reference argument must contain sufficient information for the object to
                   be uniquely identified.

                   The  list  of object is assigned to "hash_key". The mapping table records that mapped the old
                   objects to the parent object are scheduled to be deleted from the database and new  ones  are
                   scheduled  to  be  added  to  the  database when the parent is saved.  Any previously pending
                   "set_on_save" or "add_on_save" actions are discarded.

                   When adding each object when the parent is saved, if the object does not  already  exists  in
                   the database, it will be inserted.  If the object was previously loaded from or  saved to the
                   database, it will be updated.  Otherwise, it will be loaded.

                   If  called  with  no arguments and the hash key used to store the list of objects is defined,
                   the list (in list context) or a reference to that array (in scalar  context)  of  objects  is
                   returned.  Otherwise, the objects are fetched.

                   When  fetching,  if the call to "manager_class"'s "manager_method" method returns false, that
                   false value (in scalar context) or an empty list (in list context) is returned.

                   If the fetch succeeds, a list (in list context) or a reference to the array  of  objects  (in
                   scalar  context)  is returned.  (If the fetch finds zero objects, the list or array reference
                   will simply be empty.  This is still considered success.)

               add_now
                   Creates a method that will add to a list of Rose::DB::Object-derived objects that are related
                   to the current object through the "map_class", and will also save objects to the database and
                   map them to the parent object.  The objects do not have to already  exist  in  the  database;
                   they will be inserted if needed.

                   This  method returns the list of objects added when called in list context, and the number of
                   objects added when called in scalar context.  If one or more  objects  could  not  be  added,
                   undef  (in  scalar  context)  or  an  empty list (in list context) is returned and the parent
                   object's error attribute is set.

                   If passed an empty list, the method does nothing and the parent object's error  attribute  is
                   set.

                   If  passed any arguments, the parent object must have been loaded or saved prior to adding to
                   the list of objects.  If this method is called with a non-empty list as  an  argument  before
                   the parent object has been  loaded or saved, a fatal error will occur.

                   The  argument(s)  must  be a list or reference to an array containing items in one or more of
                   the following formats:

                   •   An object of type "class".

                   •   A reference to a hash containing method name/value pairs.

                   •   A single scalar primary key value.

                   The latter two formats will be used to construct an object of type "class".  A single primary
                   key value is only a valid argument format if the "class"  in  question  has  a  single-column
                   primary key.  A hash reference argument must contain sufficient information for the object to
                   be uniquely identified.

                   The parent object's list of related objects is then set to undef, causing the related objects
                   to be reloaded from the database the next time they're needed.

               add_on_save
                   Creates a method that will add to a list of Rose::DB::Object-derived objects that are related
                   to the current object through the "map_class", and will also save objects to the database and
                   map them to the parent object when the "parent" object is saved.  The objects and map records
                   will  be  added  to the database when the parent object is saved.  The objects do not have to
                   already exist in the database; they will be inserted if needed.

                   This method returns the list of objects to be added when called  in  list  context,  and  the
                   number of items to be added when called in scalar context.

                   If  passed  an empty list, the method does nothing and the parent object's error attribute is
                   set.

                   Otherwise, the argument(s) must be a list or reference to an array containing items in one or
                   more of the following formats:

                   •   An object of type "class".

                   •   A reference to a hash containing method name/value pairs.

                   •   A single scalar primary key value.

                   The latter two formats will be used to construct an object of type "class".  A single primary
                   key value is only a valid argument format if the "class"  in  question  has  a  single-column
                   primary key.  A hash reference argument must contain sufficient information for the object to
                   be uniquely identified.

                   These  objects are scheduled to be added to the database and mapped to the parent object when
                   the parent object is saved.  They are also added to  the  parent  object's  current  list  of
                   related objects, if the list is defined at the time of the call.

           For     a     complete     example     of     this     method     type    in    action,    see    the
           Rose::DB::Object::Metadata::Relationship::ManyToMany documentation.

       object_by_key
           Create a get/set methods for a single Rose::DB::Object-derived object loaded based on a  primary  key
           formed from attributes of the current object.

           Options
               class CLASS
                   The  name  of  the Rose::DB::Object-derived class of the object to be loaded.  This option is
                   required.

               foreign_key OBJECT
                   The Rose::DB::Object::Metadata::ForeignKey object that describes the "key" through which  the
                   "object_by_key"  is  fetched.   This (or the "relationship" parameter) is required when using
                   the "delete_now", "delete_on_save", and "get_set_on_save" interfaces.

               hash_key NAME
                   The key inside the hash-based object to use for the storage of the object.  Defaults  to  the
                   name of the method.

               if_not_found CONSEQUENCE
                   This  setting  determines  what  happens  when  the  key_columns have defined values, but the
                   foreign object they point to is not found.  Valid values for CONSEQUENCE are  "fatal",  which
                   will  throw an exception if the foreign object is not found, and "ok" which will merely cause
                   the relevant method(s) to return undef.  The default is "fatal".

               key_columns HASHREF
                   A reference to a hash that maps column names in the current object to those  of  the  primary
                   key in the object to be loaded.  This option is required.

               interface NAME
                   Choose the interface.  The default is "get_set".

               relationship OBJECT
                   The  Rose::DB::Object::Metadata::Relationship-derived  object that describes the relationship
                   through which the object is fetched.  This (or the "foreign_key" parameter) is required  when
                   using the "delete_now", "delete_on_save", and "get_set_on_save" interfaces.

               referential_integrity BOOL
                   If  true,  then  a  fatal  error  will occur when a method in one of the "get*" interfaces is
                   called  and  no  related   object   is   found.    The   default   is   determined   by   the
                   referential_integrity  attribute  of  the  "foreign_key"  object, or true if no "foreign_key"
                   parameter is passed.

                   This parameter conflicts with the "required" parameter.   Only  one  of  the  two  should  be
                   passed.

               required BOOL
                   If  true,  then  a  fatal  error  will occur when a method in one of the "get*" interfaces is
                   called and no related object is found.  The default is determined by the  required  attribute
                   of the "relationship" object, or true if no "relationship" parameter is passed.

                   This  parameter  conflicts  with  the "referential_integrity" parameter.  Only one of the two
                   should be passed.

               share_db BOOL
                   If true, the db attribute of the current object is shared with the object  loaded.   Defaults
                   to true.

           Interfaces
               delete_now
                   Deletes  a  Rose::DB::Object-derived  object  from the database based on a primary key formed
                   from attributes of the current object.  If "referential_integrity"  or  "required"  is  true,
                   then  the  "parent" object will have all of its attributes that refer to the "foreign" object
                   (except any columns that are also part of the primary key) set to null , and it will be saved
                   into the database.  This needs to be done first because a database that enforces  referential
                   integrity  will  not  allow a row to be deleted if it is still referenced by a foreign key in
                   another table.

                   Any previously pending "get_set_on_save" action is discarded.

                   The entire process takes place within a transaction if the  database  supports  it.   If  not
                   currently  in  a  transaction,  a new one is started and then committed on success and rolled
                   back on failure.

                   Returns true if the foreign object was deleted successfully or did not exist in the database,
                   false if any of the keys that refer to the foreign object were undef, and triggers the normal
                   Rose::DB::Object error handling in the case of any other kind of failure.

               delete_on_save
                   Deletes a Rose::DB::Object-derived object from the  database  when  the  "parent"  object  is
                   saved,   based  on  a  primary  key  formed  from  attributes  of  the  current  object.   If
                   "referential_integrity" or "required" is true, then the "parent" object will have all of  its
                   attributes  that  refer to the "foreign" object (except any columns that are also part of the
                   primary key) set to null immediately, but the actual delete will not be done until the parent
                   is saved.

                   Any previously pending "get_set_on_save" action is discarded.

                   The entire process takes place within a transaction if the  database  supports  it.   If  not
                   currently  in  a  transaction,  a new one is started and then committed on success and rolled
                   back on failure.

                   Returns true if the foreign object was deleted successfully or did not exist in the database,
                   false if any of the keys that refer to the foreign object were undef, and triggers the normal
                   Rose::DB::Object error handling in the case of any other kind of failure.

               get_set
                   Creates a method that will attempt to create and load a Rose::DB::Object-derived object based
                   on a primary key formed from attributes of the current object.

                   If passed a single argument of undef, the "hash_key" used to  store  the  object  is  set  to
                   undef.   If  "referential_integrity" or "required" is true, then the columns that participate
                   in the key are set to undef.  (If any key column is part of the primary key, however,  it  is
                   not set to undef.)  Otherwise, the argument must be one of the following:

                   •   An object of type "class"

                   •   A list of method name/value pairs.

                   •   A reference to a hash containing method name/value pairs.

                   •   A single scalar primary key value.

                   The  latter  three  argument  types  will  be used to construct an object of type "class".  A
                   single primary key value is only valid if the "class" in question has a single-column primary
                   key.  A hash reference argument must contain sufficient information  for  the  object  to  be
                   uniquely identified.

                   The   object  is  assigned  to  "hash_key"  after  having  its  "key_columns"  set  to  their
                   corresponding values in the current object.

                   If called with no arguments and the "hash_key" used to  store  the  object  is  defined,  the
                   object is returned.  Otherwise, the object is created and loaded.

                   The load may fail for several reasons.  The load will not even be attempted if any of the key
                   attributes in the current object are undefined.  Instead, undef will be returned.

                   If  the  call  to  the  newly  created  object's  load  method returns false, then the normal
                   Rose::DB::Object error handling is triggered.  The false value returned by the  call  to  the
                   load method is returned (assuming no exception was raised).

                   If the load succeeds, the object is returned.

               get_set_now
                   Creates a method that will attempt to create and load a Rose::DB::Object-derived object based
                   on  a primary key formed from attributes of the current object, and will also save the object
                   to the database when called with an appropriate object as an argument.

                   If passed a single argument of undef, the "hash_key" used to  store  the  object  is  set  to
                   undef.   If  "referential_integrity" or "required" is true, then the columns that participate
                   in the key are set to undef.  (If any key column is part of the primary key, however,  it  is
                   not set to undef.) Otherwise, the argument must be one of the following:

                   •   An object of type "class"

                   •   A list of method name/value pairs.

                   •   A reference to a hash containing method name/value pairs.

                   •   A single scalar primary key value.

                   The  latter  three  argument  types  will  be used to construct an object of type "class".  A
                   single primary key value is only a valid argument format if the "class"  in  question  has  a
                   single-column primary key.  A hash reference argument must contain sufficient information for
                   the object to be uniquely identified.

                   The   object  is  assigned  to  "hash_key"  after  having  its  "key_columns"  set  to  their
                   corresponding values in the current object.  The object is  then  immediately  saved  to  the
                   database.

                   If  the  object  does not already exists in the database, it will be inserted.  If the object
                   was previously loaded from or saved to the database, it will be updated.  Otherwise, it  will
                   be loaded.

                   The  parent  object  must have been loaded or saved prior to setting the list of objects.  If
                   this method is called with arguments before the object has been  loaded  or  saved,  a  fatal
                   error will occur.

                   If  called  with  no  arguments  and  the "hash_key" used to store the object is defined, the
                   object is returned.  Otherwise, the object is created and loaded.

                   The load may fail for several reasons.  The load will not even be attempted if any of the key
                   attributes in the current object are undefined.  Instead, undef will be returned.

                   If the call to the newly  created  object's  load  method  returns  false,  then  the  normal
                   Rose::DB::Object  error  handling  is triggered.  The false value returned by the call to the
                   load method is returned (assuming no exception was raised).

                   If the load succeeds, the object is returned.

               get_set_on_save
                   Creates a method that will attempt to create and load a Rose::DB::Object-derived object based
                   on a primary key formed from attributes of the current object, and save the object  when  the
                   "parent" object is saved.

                   If  passed  a  single  argument  of  undef, the "hash_key" used to store the object is set to
                   undef.  If "referential_integrity" or "required" is true, then the columns  that  participate
                   in  the  key are set to undef.  (If any key column is part of the primary key, however, it is
                   not set to undef.) Otherwise, the argument must be one of the following:

                   •   An object of type "class"

                   •   A list of method name/value pairs.

                   •   A reference to a hash containing method name/value pairs.

                   •   A single scalar primary key value.

                   The latter three argument types will be used to construct  an  object  of  type  "class".   A
                   single  primary  key  value  is only a valid argument format if the "class" in question has a
                   single-column primary key.  A hash reference argument must contain sufficient information for
                   the object to be uniquely identified.

                   The  object  is  assigned  to  "hash_key"  after  having  its  "key_columns"  set  to   their
                   corresponding  values in the current object.  The object will be saved into the database when
                   the "parent" object is saved.  Any previously pending "get_set_on_save" action is discarded.

                   If the object does not already exists in the database, it will be inserted.   If  the  object
                   was  previously loaded from or saved to the database, it will be updated.  Otherwise, it will
                   be loaded.

                   If called with no arguments and the "hash_key" used to  store  the  object  is  defined,  the
                   object is returned.  Otherwise, the object is created and loaded from the database.

                   The load may fail for several reasons.  The load will not even be attempted if any of the key
                   attributes in the current object are undefined.  Instead, undef will be returned.

                   If  the  call  to  the  newly  created  object's  load  method returns false, then the normal
                   Rose::DB::Object error handling is triggered.  The false value returned by the  call  to  the
                   load method is returned (assuming no exception was raised).

                   If the load succeeds, the object is returned.

           Example setup:

               # CLASS     DB TABLE
               # -------   --------
               # Product   products
               # Category  categories

               package Product;

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

               # You will almost never call the method-maker directly
               # like this.  See the Rose::DB::Object::Metadata docs
               # for examples of more common usage.
               use Rose::DB::Object::MakeMethods::Generic
               (
                 object_by_key =>
                 [
                   category =>
                   {
                     interface   => 'get_set',
                     class       => 'Category',
                     key_columns =>
                     {
                       # Map Product column names to Category column names
                       category_id => 'id',
                     },
                   },
                 ]
               );
               ...

           Example - get_set interface:

               $product = Product->new(id => 5, category_id => 99);

               # Read from the categories table
               $category = $product->category;

               # $product->category call is roughly equivalent to:
               #
               # $cat = Category->new(id => $product->category_id
               #                      db => $prog->db);
               #
               # $ret = $cat->load;
               # return $ret  unless($ret);
               # return $cat;

               # Does not write to the db
               $product->category(Category->new(...));

               $product->save; # writes to products table only

           Example - get_set_now interface:

               # Read from the products table
               $product = Product->new(id => 5)->load;

               # Read from the categories table
               $category = $product->category;

               # Write to the categories table:
               # (all possible argument formats show)

               # Object argument
               $product->category(Category->new(...));

               # Primary key value
               $product->category(123);

               # Method name/value pairs in a hashref
               $product->category(id => 123);

               # Method name/value pairs in a hashref
               $product->category({ id => 123 });

               # Write to the products table
               $product->save;

           Example - get_set_on_save interface:

               # Read from the products table
               $product = Product->new(id => 5)->load;

               # Read from the categories table
               $category = $product->category;

               # These do not write to the db:

               # Object argument
               $product->category(Category->new(...));

               # Primary key value
               $product->category(123);

               # Method name/value pairs in a hashref
               $product->category(id => 123);

               # Method name/value pairs in a hashref
               $product->category({ id => 123 });

               # Write to both the products and categories tables
               $product->save;

           Example - delete_now interface:

               # Read from the products table
               $product = Product->new(id => 5)->load;

               # Write to both the categories and products tables
               $product->delete_category();

           Example - delete_on_save interface:

               # Read from the products table
               $product = Product->new(id => 5)->load;

               # Does not write to the db
               $product->delete_category();

               # Write to both the products and categories tables
               $product->save;

       scalar
           Create get/set methods for scalar attributes.

           Options
               default VALUE
                   Determines the default value of the attribute.

               check_in ARRAYREF
                   A reference to an array of valid values.  When setting the attribute, if the new value is not
                   equal (string comparison) to one of the valid values, a fatal error will occur.

               hash_key NAME
                   The  key  inside the hash-based object to use for the storage of this attribute.  Defaults to
                   the name of the method.

               init_method NAME
                   The name of the method to call  when  initializing  the  value  of  an  undefined  attribute.
                   Defaults to the method name with the prefix "init_" added.  This option implies "with_init".

               interface NAME
                   Choose the interface.  The "get_set" interface is the default.

               length INT
                   The maximum number of characters in the string.

               overflow BEHAVIOR
                   Determines  the behavior when the value is greater than the number of characters specified by
                   the "length" option.  Valid values for BEHAVIOR are:

                   fatal
                       Throw an exception.

                   truncate
                       Truncate the value to the correct length.

                   warn
                       Print a warning message.

               with_init BOOL
                   Modifies the behavior of the "get_set" and "get" interfaces.  If the attribute is  undefined,
                   the  method  specified  by the "init_method" option is called and the attribute is set to the
                   return value of that method.

           Interfaces
               get_set
                   Creates a get/set method for an object attribute.  When called with an argument, the value of
                   the attribute is set.  The current value of the attribute is returned.

               get Creates an accessor method for an object attribute that returns  the  current  value  of  the
                   attribute.

               set Creates a mutator method for an object attribute.  When called with an argument, the value of
                   the attribute is set.  If called with no arguments, a fatal error will occur.

           Example:

               package MyDBObject;

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

               use Rose::DB::Object::MakeMethods::Generic
               (
                 scalar =>
                 [
                   name => { default => 'Joe' },
                   type =>
                   {
                     with_init => 1,
                     check_in  => [ qw(AA AAA C D) ],
                   }
                   set_type =>
                   {
                     check_in  => [ qw(AA AAA C D) ],
                   }
                 ],
               );

               sub init_type { 'C' }
               ...

               $o = MyDBObject->new(...);

               print $o->name; # Joe
               print $o->type; # C

               $o->name('Bob'); # set
               $o->type('AA');  # set

               eval { $o->type('foo') }; # fatal error: invalid value

               print $o->name, ' is ', $o->type; # get

       set Create  get/set  methods  for  "set"  attributes.    A  "set"  column in a database table contains an
           unordered group of values.  Not all databases support  a  "set"  column  type.   Check  the  Rose::DB
           documentation for your database type.

           Options
               default ARRAYREF
                   Determines the default value of the attribute.  The value should be a reference to an array.

               hash_key NAME
                   The  key  inside the hash-based object to use for the storage of this attribute.  Defaults to
                   the name of the method.

               interface NAME
                   Choose the interface.  The default is "get_set".

               values ARRAYREF
                   A reference to an array of valid values for the  set.   If  present,  attempting  to  use  an
                   invalid value will cause a fatal error.

           Interfaces
               get_set
                   Creates  a  get/set  method for a "set" object attribute.  A "set" column in a database table
                   contains an unordered group of values.  On the Perl side of the fence, an  ordered  list  (an
                   array)  is  used to store the values, but keep in mind that the order is not significant, nor
                   is it guaranteed to be preserved.

                   When setting the attribute, the value is passed through the parse_set method of the  object's
                   db attribute.

                   When  saving  to  the  database,  if the attribute value is defined, the method will pass the
                   attribute value through the format_set method of the object's db attribute  before  returning
                   it.

                   When  not saving to the database, the method returns the set as a list in list context, or as
                   a reference to the array in scalar context.

               get Creates an accessor method for a "set" object attribute.  A "set" column in a database  table
                   contains  an  unordered  group of values.  On the Perl side of the fence, an ordered list (an
                   array) is used to store the values, but keep in mind that the order is not  significant,  nor
                   is it guaranteed to be preserved.

                   When  saving  to  the  database,  if the attribute value is defined, the method will pass the
                   attribute value through the format_set method of the object's db attribute  before  returning
                   it.

                   When  not saving to the database, the method returns the set as a list in list context, or as
                   a reference to the array in scalar context.

               set Creates a mutator method for a "set" object attribute.  A "set" column in  a  database  table
                   contains  an  unordered  group of values.  On the Perl side of the fence, an ordered list (an
                   array) is used to store the values, but keep in mind that the order is not  significant,  nor
                   is it guaranteed to be preserved.

                   When  setting the attribute, the value is passed through the parse_set method of the object's
                   db attribute.

                   When saving to the database, if the attribute value is defined,  the  method  will  pass  the
                   attribute  value  through the format_set method of the object's db attribute before returning
                   it.

                   When not saving to the database, the method returns the set as a list in list context, or  as
                   a reference to the array in scalar context.

           Example:

               package Person;

               our @ISA = qw(Rose::DB::Object);
               ...
               use Rose::DB::Object::MakeMethods::Generic
               (
                 set =>
                 [
                   'nicknames',
                   'set_nicks' => { interface => 'set', hash_key => 'nicknames' },

                   'parts' => { default => [ qw(arms legs) ] },
                 ],
               );
               ...

               @parts = $person->parts; # ('arms', 'legs')
               $parts = $person->parts; # [ 'arms', 'legs' ]

               $person->nicknames('Jack', 'Gimpy');   # set with list
               $person->nicknames([ 'Slim', 'Gip' ]); # set with array ref

               $person->set_nicks('Jack', 'Gimpy');   # set with list
               $person->set_nicks([ 'Slim', 'Gip' ]); # set with array ref

       varchar
           Create get/set methods for variable-length character string attributes.

           Options
               default VALUE
                   Determines the default value of the attribute.

               hash_key NAME
                   The  key  inside the hash-based object to use for the storage of this attribute.  Defaults to
                   the name of the method.

               init_method NAME
                   The name of the method to call  when  initializing  the  value  of  an  undefined  attribute.
                   Defaults to the method name with the prefix "init_" added.  This option implies "with_init".

               interface NAME
                   Choose the interface.  The "get_set" interface is the default.

               length INT
                   The maximum number of characters in the string.

               overflow BEHAVIOR
                   Determines  the behavior when the value is greater than the number of characters specified by
                   the "length" option.  Valid values for BEHAVIOR are:

                   fatal
                       Throw an exception.

                   truncate
                       Truncate the value to the correct length.

                   warn
                       Print a warning message.

               with_init BOOL
                   Modifies the behavior of the "get_set" and "get" interfaces.  If the attribute is  undefined,
                   the  method  specified  by the "init_method" option is called and the attribute is set to the
                   return value of that method.

           Interfaces
               get_set
                   Creates a get/set accessor method  for  a  fixed-length  character  string  attribute.   When
                   setting,  any  strings  longer  than "length" will be truncated.  If "length" is omitted, the
                   string will be left unmodified.

           Example:

               package MyDBObject;

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

               use Rose::DB::Object::MakeMethods::Generic
               (
                 varchar =>
                 [
                   'name' => { length => 3 },
                 ],
               );

               ...

               $o->name('John'); # truncates on set
               print $o->name;   # 'Joh'

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::Objec...ethods::Generic(3pm)