#!/usr/bin/perl -w use strict; use Test::More tests => 183; BEGIN { require 't/test-lib.pl'; use_ok('Rose::DB::Object'); use_ok('Rose::DB::Object::Manager'); use_ok('Rose::DB::Object::ConventionManager'); use_ok('Rose::DB::Object::ConventionManager::Null'); } # # related_table_to_class # my $cm = Rose::DB::Object::ConventionManager->new; is($cm->related_table_to_class('prices', 'My::Product'), 'My::Price', 'related_table_to_class 1'); is($cm->related_table_to_class('big_hats', 'A::B::FooBar'), 'A::B::BigHat', 'related_table_to_class 2'); is($cm->related_table_to_class('a1_steaks', 'Meat'), 'A1Steak', 'related_table_to_class 3'); # # table_to_class # is($cm->table_to_class('products', 'My::'), 'My::Product', 'table_to_class 1'); is($cm->table_to_class('products'), 'Product', 'table_to_class 2'); is($cm->table_to_class('big_hats', 'My::'), 'My::BigHat', 'table_to_class 3'); is($cm->table_to_class('my5_hat_pig'), 'My5HatPig', 'table_to_class 4'); # # singular_to_plural # is($cm->singular_to_plural('box'), 'boxes', 'singular_to_plural 1'); is($cm->singular_to_plural('dress'), 'dresses', 'singular_to_plural 2'); is($cm->singular_to_plural('ceres'), 'cereses', 'singular_to_plural 3'); is($cm->singular_to_plural('daisy'), 'daisies', 'singular_to_plural 4'); is($cm->singular_to_plural('dogs'), 'dogs', 'singular_to_plural 5'); is($cm->singular_to_plural('product'), 'products', 'singular_to_plural 6'); # # plural_to_singular # is($cm->plural_to_singular('daisies'), 'daisy', 'plural_to_singular 1'); is($cm->plural_to_singular('dresses'), 'dress', 'plural_to_singular 2'); is($cm->plural_to_singular('dress'), 'dress', 'plural_to_singular 3'); is($cm->plural_to_singular('products'), 'product', 'plural_to_singular 4'); # # is_singleton # my $cm1 = Rose::DB::Object::ConventionManager::Null->new; my $cm2 = Rose::DB::Object::ConventionManager::Null->new; is($cm1, $cm2, 'null singleton'); # # auto_manager_* # is($cm->auto_manager_base_class, 'Rose::DB::Object::Manager', 'auto_manager_base_class'); is($cm->auto_manager_class_name('My::Object'), 'My::Object::Manager', 'auto_manager_class_name'); AUTO_MANAGER_CLASS_TEST: { package My::Dog; @My::Dog::ISA = 'Rose::DB::Object'; my $dog_cm = My::Dog->meta->convention_manager; package main; is($dog_cm->auto_manager_class_name, 'My::Dog::Manager', 'auto_manager_base_class no args'); is($dog_cm->auto_manager_base_name, 'dogs', 'auto_manager_base_name with no args'); is($dog_cm->auto_manager_base_name('products'), 'products', 'auto_manager_base_name with table'); is($dog_cm->auto_manager_base_name('dogs', 'My::Dog'), 'dogs', 'auto_manager_base_name with table and class'); } is($cm->auto_manager_method_name('doesntmatter'), undef, 'auto_manager_method_name'); # # auto_table # my %Expect_Table = ( 'OtherObject' => 'other_objects', 'My::OtherObject' => 'other_objects', 'My::Other::Object' => 'objects', 'Other123Object' => 'other123_objects', 'My::Other123Object' => 'other123_objects', 'My::Other::123Object' => '123_objects', 'Mess2' => 'mess2s', 'Mess' => 'messes', 'My::Mess' => 'messes', 'My::Other::Mess' => 'messes', 'Box' => 'boxes', 'My::Box' => 'boxes', 'My::Other::Box' => 'boxes', ); foreach my $pkg (sort keys %Expect_Table) { no strict 'refs'; @{"${pkg}::ISA"} = qw(Rose::DB::Object); *{"${pkg}::init_db"} = sub { Rose::DB->new('pg') }; is($pkg->meta->table, $Expect_Table{$pkg}, "auto_table $pkg"); } SKIP: { eval "require Lingua::EN::Inflect"; skip('missing Lingua::EN::Inflect 1.89', 19) if($@ || $Lingua::EN::Inflect::VERSION != 1.89); %Expect_Table = ( 'OtherPerson' => 'other_people', 'My::Person' => 'people', 'My::Other::Person' => 'people', 'Other123Person' => 'other123_people', 'My::Other123Person' => 'other123_people', 'My::Other::123Person' => '123_people', 'MyMess2' => 'my_mess2s', 'My2Mess' => 'my2_messes', 'My2::Mess' => 'messes', 'My2::Other::Mess' => 'messes', 'Deer' => 'deer', 'My::Deer' => 'deer', 'My::Other::Deer' => 'deer', 'Alumnus' => 'alumni', 'My::Alumnus' => 'alumni', 'My::Other::Alumnus' => 'alumni', 'pBox' => 'p_boxes', 'My::pBox' => 'p_boxes', 'My::Other::pBox' => 'p_boxes', ); foreach my $pkg (sort keys %Expect_Table) { no strict 'refs'; @{"${pkg}::ISA"} = qw(Rose::DB::Object); *{"${pkg}::init_db"} = sub { Rose::DB->new('pg') }; $pkg->meta->convention_manager->singular_to_plural_function(\&Lingua::EN::Inflect::PL_N); is($pkg->meta->table, $Expect_Table{$pkg}, "auto_table en $pkg"); } } My::OtherObject->meta->columns ( name => { type => 'varchar'}, k1 => { type => 'int' }, k2 => { type => 'int' }, k3 => { type => 'int' }, ); My::OtherObject->meta->primary_key_columns([ qw(k1 k2 k3) ]); My::OtherObject->meta->initialize; # # auto_table_name # AUTO_TABLE: { package My::AutoTable; @My::AutoTable::ISA = ('Rose::DB::Object'); My::AutoTable->meta->convention_manager->tables_are_singular(1); Test::More::is(My::AutoTable->meta->table, 'auto_table', 'auto_table_name() singular'); My::AutoTable->meta->convention_manager->tables_are_singular(0); My::AutoTable->meta->table(undef); Test::More::is(My::AutoTable->meta->table, 'auto_tables', 'auto_table_name() plural'); } # # auto_primary_key_columns # PK_ID: { package My::PKClass1; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns ( 'name', 'id', 'object_id', ); my @columns = __PACKAGE__->meta->primary_key_column_names; Test::More::ok(@columns == 1 && $columns[0] eq 'id', 'auto_primary_key_column_names id'); } PK_OBJECT_ID: { package My::PK::OtherObject; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns ( 'name', 'other_object_id', ); my @columns = __PACKAGE__->meta->primary_key_column_names; Test::More::ok(@columns == 1 && $columns[0] eq 'other_object_id', 'auto_primary_key_column_names other_object_id'); } PK_SERIAL_ID: { package My::PKSerial::OtherObject; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns ( 'pk' => { type => 'serial' }, 'roo' => { type => 'serial' }, 'foo', ); my @columns = __PACKAGE__->meta->primary_key_column_names; Test::More::ok(@columns == 1 && $columns[0] eq 'pk', 'auto_primary_key_column_names pk'); } # # auto_column_method_name # COLUMN_METHOD: { package MyColumnCM; our @ISA = qw(Rose::DB::Object::ConventionManager); sub auto_column_method_name { my($self, $type, $column, $name, $object_class) = @_; return $column->is_primary_key_member ? $name : "x_${type}_$name"; } package MyColumnObject; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } MyColumnObject->meta->convention_manager('MyColumnCM'); __PACKAGE__->meta->columns(qw(id a b)); __PACKAGE__->meta->initialize; package main; my $o = MyColumnObject->new; ok($o->can('id'), 'auto_column_method_name 1'); ok($o->can('x_get_set_a'), 'auto_column_method_name 2'); ok($o->can('x_get_set_b'), 'auto_column_method_name 3'); ok(!$o->can('a'), 'auto_column_method_name 4'); ok(!$o->can('b'), 'auto_column_method_name 5'); } # # auto_foreign_key # FK1: { package My::FK1::OtherObject; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id name)); __PACKAGE__->meta->initialize; package My::FK1::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id other_object_id)); __PACKAGE__->meta->foreign_keys(qw(other_object)); __PACKAGE__->meta->initialize; } my $fk = My::FK1::Object->meta->foreign_key('other_object'); ok($fk, 'auto_foreign_key 1'); is($fk->class, 'My::FK1::OtherObject', 'auto_foreign_key 2'); my $kc = $fk->key_columns; is(scalar keys %$kc, 1, 'auto_foreign_key 3'); is($kc->{'other_object_id'}, 'id', 'auto_foreign_key 4'); FK2: { package My::FK2::OtherObj; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id name)); __PACKAGE__->meta->initialize; package My::FK2::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id other_object_id)); __PACKAGE__->meta->foreign_keys ( other_object => { class => 'My::FK2::OtherObj', } ); __PACKAGE__->meta->initialize; } $fk = My::FK2::Object->meta->foreign_key('other_object'); ok($fk, 'auto_foreign_key 5'); is($fk->class, 'My::FK2::OtherObj', 'auto_foreign_key 6'); $kc = $fk->key_columns; is(scalar keys %$kc, 1, 'auto_foreign_key 7'); is($kc->{'other_object_id'}, 'id', 'auto_foreign_key 8'); FK3: { package My::FK3::OtherObj; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(eyedee => { type => 'serial' }, 'name'); __PACKAGE__->meta->initialize; package My::FK3::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id other_obj_eyedee)); __PACKAGE__->meta->foreign_keys ( other_obj => { key_columns => { other_obj_eyedee => 'eyedee' }, } ); __PACKAGE__->meta->initialize; } $fk = My::FK3::Object->meta->foreign_key('other_obj'); ok($fk, 'auto_foreign_key 9'); is($fk->class, 'My::FK3::OtherObj', 'auto_foreign_key 10'); $kc = $fk->key_columns; is(scalar keys %$kc, 1, 'auto_foreign_key 11'); is($kc->{'other_obj_eyedee'}, 'eyedee', 'auto_foreign_key 12'); FK4: { package My::FK4::OtherObj; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(eyedee => { type => 'serial' }, 'name'); __PACKAGE__->meta->initialize; package My::FK4::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id other_obj_eyedee)); __PACKAGE__->meta->foreign_keys(qw(other_obj)); __PACKAGE__->meta->initialize; } $fk = My::FK4::Object->meta->foreign_key('other_obj'); ok($fk, 'auto_foreign_key 13'); is($fk->class, 'My::FK4::OtherObj', 'auto_foreign_key 14'); $kc = $fk->key_columns; is(scalar keys %$kc, 1, 'auto_foreign_key 15'); is($kc->{'other_obj_eyedee'}, 'eyedee', 'auto_foreign_key 16'); # # auto_relationship # # one to one OTO1: { package My::OTO1::OtherObject; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id name)); __PACKAGE__->meta->initialize; package My::OTO1::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id other_object_id)); __PACKAGE__->meta->relationships(other_object => 'one to one'); __PACKAGE__->meta->initialize; } my $rel = My::OTO1::Object->meta->relationship('other_object'); ok($rel, 'auto_relationship one to one 1'); is($rel->class, 'My::OTO1::OtherObject', 'auto_relationship one to one 2'); $cm = $rel->column_map; is(scalar keys %$cm, 1, 'auto_relationship one to one 3'); is($cm->{'other_object_id'}, 'id', 'auto_relationship one to one 4'); OTO2: { package My::OTO2::OtherObj; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id name)); __PACKAGE__->meta->initialize; package My::OTO2::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id other_object_id)); __PACKAGE__->meta->relationships ( other_object => { type => 'one to one', class => 'My::OTO2::OtherObj', } ); __PACKAGE__->meta->initialize; } $rel = My::OTO2::Object->meta->relationship('other_object'); ok($rel, 'auto_relationship one to one 5'); is($rel->class, 'My::OTO2::OtherObj', 'auto_relationship one to one 6'); $cm = $rel->column_map; is(scalar keys %$cm, 1, 'auto_relationship one to one 7'); is($cm->{'other_object_id'}, 'id', 'auto_relationship one to one 8'); OTO3: { package My::OTO3::OtherObj; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(eyedee => { type => 'serial' }, 'name'); __PACKAGE__->meta->initialize; package My::OTO3::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id other_obj_id)); __PACKAGE__->meta->relationships ( other_obj => { type => 'one to one', column_map => { other_obj_id => 'eyedee' }, } ); __PACKAGE__->meta->initialize; } $rel = My::OTO3::Object->meta->relationship('other_obj'); ok($rel, 'auto_relationship one to one 9'); is($rel->class, 'My::OTO3::OtherObj', 'auto_relationship one to one 10'); $cm = $rel->column_map; is(scalar keys %$cm, 1, 'auto_relationship one to one 11'); is($cm->{'other_obj_id'}, 'eyedee', 'auto_relationship one to one 12'); OTO4: { package My::OTO4::OtherObj; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(eyedee => { type => 'serial' }, 'name'); __PACKAGE__->meta->initialize; package My::OTO4::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id other_obj_eyedee)); __PACKAGE__->meta->relationships ( other_obj => { type => 'one to one' } ); __PACKAGE__->meta->initialize; } $rel = My::OTO4::Object->meta->relationship('other_obj'); ok($rel, 'auto_relationship one to one 13'); is($rel->class, 'My::OTO4::OtherObj', 'auto_relationship one to one 14'); $cm = $rel->column_map; is(scalar keys %$cm, 1, 'auto_relationship one to one 15'); is($cm->{'other_obj_eyedee'}, 'eyedee', 'auto_relationship one to one 16'); # many to one MTO1: { package My::MTO1::OtherObject; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id name)); __PACKAGE__->meta->initialize; package My::MTO1::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id other_object_id)); __PACKAGE__->meta->relationships(other_object => 'many to one'); __PACKAGE__->meta->initialize; } $rel = My::MTO1::Object->meta->relationship('other_object'); ok($rel, 'auto_relationship many to one 1'); is($rel->class, 'My::MTO1::OtherObject', 'auto_relationship many to one 2'); $cm = $rel->column_map; is(scalar keys %$cm, 1, 'auto_relationship many to one 3'); is($cm->{'other_object_id'}, 'id', 'auto_relationship many to one 4'); MTO2: { package My::MTO2::OtherObj; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id name)); __PACKAGE__->meta->initialize; package My::MTO2::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id other_object_id)); __PACKAGE__->meta->relationships ( other_object => { type => 'many to one', class => 'My::MTO2::OtherObj', } ); __PACKAGE__->meta->initialize; } $rel = My::MTO2::Object->meta->relationship('other_object'); ok($rel, 'auto_relationship many to one 5'); is($rel->class, 'My::MTO2::OtherObj', 'auto_relationship many to one 6'); $cm = $rel->column_map; is(scalar keys %$cm, 1, 'auto_relationship many to one 7'); is($cm->{'other_object_id'}, 'id', 'auto_relationship many to one 8'); MTO3: { package My::MTO3::OtherObj; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(eyedee => { type => 'serial' }, 'name'); __PACKAGE__->meta->initialize; package My::MTO3::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id other_obj_id)); __PACKAGE__->meta->relationships ( other_obj => { type => 'many to one', column_map => { other_obj_id => 'eyedee' }, } ); __PACKAGE__->meta->initialize; } $rel = My::MTO3::Object->meta->relationship('other_obj'); ok($rel, 'auto_relationship many to one 9'); is($rel->class, 'My::MTO3::OtherObj', 'auto_relationship many to one 10'); $cm = $rel->column_map; is(scalar keys %$cm, 1, 'auto_relationship many to one 11'); is($cm->{'other_obj_id'}, 'eyedee', 'auto_relationship many to one 12'); MTO4: { package My::MTO4::OtherObj; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(eyedee => { type => 'serial' }, 'name'); __PACKAGE__->meta->initialize; package My::MTO4::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id other_obj_eyedee)); __PACKAGE__->meta->relationships ( other_obj => { type => 'many to one' } ); __PACKAGE__->meta->initialize; } $rel = My::MTO4::Object->meta->relationship('other_obj'); ok($rel, 'auto_relationship many to one 13'); is($rel->class, 'My::MTO4::OtherObj', 'auto_relationship many to one 14'); $cm = $rel->column_map; is(scalar keys %$cm, 1, 'auto_relationship many to one 15'); is($cm->{'other_obj_eyedee'}, 'eyedee', 'auto_relationship many to one 16'); # one to many OTM1: { package My::OTM1::OtherObject; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id name object_id)); __PACKAGE__->meta->initialize; package My::OTM1::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id name)); __PACKAGE__->meta->relationships(other_objects => 'one to many'); __PACKAGE__->meta->initialize; } $rel = My::OTM1::Object->meta->relationship('other_objects'); ok($rel, 'auto_relationship one to many 1'); is($rel->class, 'My::OTM1::OtherObject', 'auto_relationship one to many 2'); $cm = $rel->column_map; is(scalar keys %$cm, 1, 'auto_relationship one to many 3'); is($cm->{'id'}, 'object_id', 'auto_relationship one to many 4'); OTM2: { package My::OTM2::OtherObj; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id name object_id)); __PACKAGE__->meta->initialize; package My::OTM2::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id name)); __PACKAGE__->meta->relationships ( other_objects => { type => 'one to many', class => 'My::OTM2::OtherObj', } ); __PACKAGE__->meta->initialize; } $rel = My::OTM2::Object->meta->relationship('other_objects'); ok($rel, 'auto_relationship one to many 5'); is($rel->class, 'My::OTM2::OtherObj', 'auto_relationship one to many 6'); $cm = $rel->column_map; is(scalar keys %$cm, 1, 'auto_relationship one to many 7'); is($cm->{'id'}, 'object_id', 'auto_relationship one to many 8'); OTM3: { package My::OTM3::OtherObj; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(meyedee => { type => 'serial' }, 'name', 'object_eyedee'); __PACKAGE__->meta->initialize; package My::OTM3::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(eyedee => { type => 'serial' }, 'name'); __PACKAGE__->meta->relationships ( other_obj => { type => 'one to many', column_map => { eyedee => 'object_eyedee' }, } ); __PACKAGE__->meta->initialize; } $rel = My::OTM3::Object->meta->relationship('other_obj'); ok($rel, 'auto_relationship one to many 9'); is($rel->class, 'My::OTM3::OtherObj', 'auto_relationship one to many 10'); $cm = $rel->column_map; is(scalar keys %$cm, 1, 'auto_relationship one to many 11'); is($cm->{'eyedee'}, 'object_eyedee', 'auto_relationship one to many 12'); OTM4: { package My::OTM4::OtherObj; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(meyedee => { type => 'serial' }, 'name', 'object_eyedee'); __PACKAGE__->meta->initialize; package My::OTM4::Object; our @ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(eyedee => { type => 'serial' }, 'name'); __PACKAGE__->meta->relationships ( other_objs => { type => 'one to many' } ); __PACKAGE__->meta->initialize; } $rel = My::OTM4::Object->meta->relationship('other_objs'); ok($rel, 'auto_relationship one to many 13'); is($rel->class, 'My::OTM4::OtherObj', 'auto_relationship one to many 14'); $cm = $rel->column_map; is(scalar keys %$cm, 1, 'auto_relationship one to many 15'); is($cm->{'eyedee'}, 'object_eyedee', 'auto_relationship one to many 16'); # many to many my $i = 0; my @map_classes = qw(ObjectsOtherObjectsMap ObjectOtherObjectMap OtherObjectsObjectsMap OtherObjectObjectMap ObjectsOtherObjects ObjectOtherObjects OtherObjectsObjects OtherObjectObjects OtherObjectMap OtherObjectsMap ObjectMap ObjectsMap); foreach my $class (@map_classes) { $i++; my $defs=<<"EOF"; package My::MTM${i}::$class; our \@ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id object_id other_object_id)); package My::MTM${i}::OtherObject; our \@ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id name)); __PACKAGE__->meta->initialize; package My::MTM${i}::Object; our \@ISA = qw(Rose::DB::Object); sub init_db { Rose::DB->new('pg') } __PACKAGE__->meta->columns(qw(id name)); My::MTM${i}::$class->meta->foreign_keys(qw(object other_object)); My::MTM${i}::$class->meta->initialize; My::MTM${i}::Object->meta->relationships(other_objects => 'many to many'); My::MTM${i}::Object->meta->initialize EOF eval $defs; die $@ if($@); my $obj_class = "My::MTM${i}::Object"; $rel = $obj_class->meta->relationship('other_objects'); ok($rel, "auto_relationship many to many $i.1"); is($rel->map_class, "My::MTM${i}::$class", "auto_relationship many to many $i.2"); is($rel->map_from, 'object', "auto_relationship many to many $i.3"); is($rel->map_to, 'other_object', "auto_relationship many to many $i.4"); }