The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;

use lib '../Rose-DB/lib';
use lib 'lib';
use lib 't/cg-lib';

require 't/test-lib.pl';

my $db_type = $ARGV[0] or die "Missing database type argument";

Rose::DB->default_type($db_type);

my $class_prefix = 'My' . ucfirst($db_type);

my $product_class = $class_prefix . '::Product';
my $product_manager_class = $product_class . '::Manager';

eval "require ${product_class}::Manager";
die "Could not load $product_class - $@"  if($@);

my $color_class = $class_prefix . '::Color';
my $color_manager_class = $color_class . '::Manager';

eval "require ${color_class}::Manager";
die "Could not load $color_class - $@"  if($@);

my $p = $product_class->new(id => 1, name => 'A');
$p->prices({ region => 'IS', price => 1.25 },
           { region => 'DE', price => 4.25 });

$p->colors({ code => 'CC1', name => 'red' },
           { code => 'CC2', name => 'green' });

$p->vendor({ name => 'V1' });

$p->save;

$p = $product_class->new(id => $p->id)->load;
my $ret = $p->vendor->name . '; ' .
          join(', ', map { $_->region . ': ' . $_->price } 
            sort { $a->price <=> $b->price } $p->prices) . '; ' .
          join(', ', map { $_->name } sort { $a->name cmp $b->name } $p->colors) . '; ';

my $c = $color_class->new(name => 'red')->load;

$ret .= $c->name . ': ' . $c->code, '; ';

print $ret, "\n";

my $v = $p->vendor;
$p->delete(cascade => 1);
$v->delete;

$product_manager_class->delete_products(all => 1);
$color_manager_class->delete_colors(all => 1);

#My::Product->meta->auto_load_related_classes(0);
#print My::Product->meta->perl_class_definition(braces => 'bsd', indent => 2);

__END__

DROP TABLE product_colors CASCADE;
DROP TABLE prices CASCADE;
DROP TABLE products CASCADE;
DROP TABLE colors CASCADE;
DROP TABLE vendors CASCADE;

CREATE TABLE vendors
(
  id    SERIAL NOT NULL PRIMARY KEY,
  name  VARCHAR(255)
);

CREATE TABLE colors
(
  code  CHAR(3) NOT NULL PRIMARY KEY,
  name  VARCHAR(255)
);

CREATE TABLE products
(
  id        SERIAL NOT NULL PRIMARY KEY,
  name      VARCHAR(255),
  vendor_id INT NOT NULL REFERENCES vendors (id)
);

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

CREATE TABLE product_colors
(
  id           SERIAL NOT NULL PRIMARY KEY,
  product_id   INT NOT NULL REFERENCES products (id),
  color_code   CHAR(3) NOT NULL REFERENCES colors (code)
);

INSERT INTO vendors (id, name) VALUES (1, 'V1');
INSERT INTO vendors (id, name) VALUES (2, 'V2');

INSERT INTO products (id, name, vendor_id) VALUES (1, 'A', 1);
INSERT INTO products (id, name, vendor_id) VALUES (2, 'B', 2);
INSERT INTO products (id, name, vendor_id) VALUES (3, 'C', 1);

INSERT INTO prices (product_id, region, price) VALUES (1, 'US', 1.25);
INSERT INTO prices (product_id, region, price) VALUES (1, 'DE', 4.25);
INSERT INTO prices (product_id, region, price) VALUES (2, 'US', 5.55);
INSERT INTO prices (product_id, region, price) VALUES (3, 'US', 5.78);
INSERT INTO prices (product_id, region, price) VALUES (3, 'US', 9.99);

INSERT INTO colors (code, name) VALUES ('CC1', 'red');
INSERT INTO colors (code, name) VALUES ('CC2', 'green');
INSERT INTO colors (code, name) VALUES ('CC3', 'blue');
INSERT INTO colors (code, name) VALUES ('CC4', 'pink');

INSERT INTO product_colors (product_id, color_code) VALUES (1, 'CC1');
INSERT INTO product_colors (product_id, color_code) VALUES (1, 'CC2');

INSERT INTO product_colors (product_id, color_code) VALUES (2, 'CC4');

INSERT INTO product_colors (product_id, color_code) VALUES (3, 'CC2');
INSERT INTO product_colors (product_id, color_code) VALUES (3, 'CC3');