package Rose::DB::Object::Std::Metadata; use strict; use Carp(); use Rose::DB::Object::Metadata::PrimaryKey; use Rose::DB::Object::Metadata; our @ISA = qw(Rose::DB::Object::Metadata); our $VERSION = '0.02'; sub init_primary_key { Rose::DB::Object::Metadata::PrimaryKey->new(parent => shift, columns => 'id'); } sub primary_key_column_names { wantarray ? 'id' : [ 'id' ] } sub add_primary_key_column { Carp::croak __PACKAGE__, " objects are required to have a single primary key named 'id'" unless((ref $_[1] && $_[1][0] eq 'id') || $_[1] eq 'id'); # No point in doing this... #shift->SUPER::add_primary_key(@_); } *add_primary_key_columns = \&add_primary_key_columns; sub generate_primary_key_placeholders { shift; shift->generate_primary_key_placeholders(@_) } sub initialize { my($self) = shift; my $id_column = $self->column('id'); unless($id_column) { $self->add_column(id => { primary_key => 1 }); $id_column = $self->column('id'); } $self->SUPER::initialize(@_); } 1; __END__ =head1 NAME Rose::DB::Object::Std::Metadata - Standardized database object metadata. =head1 SYNOPSIS use Rose::DB::Object::Std::Metadata; $meta = Rose::DB::Object::Std::Metadata->new(class => 'Product'); # ...or... # $meta = Rose::DB::Object::Std::Metadata->for_class('Product'); $meta->table('products'); $meta->columns ( id => { type => 'int', primary_key => 1 }, name => { type => 'varchar', length => 255 }, description => { type => 'text' }, category_id => { type => 'int' }, status => { type => 'varchar', check_in => [ 'active', 'inactive' ], default => 'inactive', }, start_date => { type => 'datetime' }, end_date => { type => 'datetime' }, date_created => { type => 'timestamp', default => 'now' }, last_modified => { type => 'timestamp', default => 'now' }, ); $meta->add_unique_key('name'); $meta->foreign_keys ( category => { class => 'Category', key_columns => { category_id => 'id', } }, ); ... =head1 DESCRIPTION C is a subclass of L that is designed to serve the needs of L objects. See the L documentations for information on what differentiates it from L. Only the methods that are overridden are documented here. See the L documentation for the rest. =head1 OBJECT METHODS =over 4 =item B This method is an alias for the C method. =item B Since L objects must have a single primary key column named "id", calling this method with a COLUMNS argument of anything other than the column name "id" or a reference to an array containing the column name "id" will cause a fatal error. In general, you do not need to use this method at all since the C method is hard-coded to always return "id". =item B This method does the same thing as the L method of the same name, with one exception. If there is no column named "id" in the list of columns, a scalar primary key column named "id" is added to the column list. Then initialization proceeds as usual. =item B Always returns the column name "id" (in list context) or a reference to an array containing the column name "id" (in scalar context). =back =head1 AUTHOR John C. Siracusa (siracusa@gmail.com) =head1 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.