Package My::Hosts; use base qw(My::Class::DBI::Subclass); __PACKAGE__->table('hosts'); __PACKAGE__->columns(Primary => qw(ID)); __PACKAGE__->columns(Essential => qw(name IPAddress location OS)); Package My::MailServers; use base qw(My::Hosts); __PACKAGE__->columns(mailserver => qw(MTA version)); Package My::WebServers; use base qw(My::Hosts); __PACKAGE__->columns(webserver => qw(httpd version CGI)); #### Package My::Hosts; use base qw(My::Class::DBI::Subclass); __PACKAGE__->table('hosts'); __PACKAGE__->columns(Primary => qw(ID)); __PACKAGE__->columns(Essential => qw(name IPAddress location OS)); __PACKAGE__->has_many('mailservers', 'My::MailServers', 'host'); __PACKAGE__->has_many('webservers', 'My::WebServers', 'host'); # has_many also defines a column in the foreign class: # in this case webserver->host # which returns the relevant Hosts object when called. Package My::MailServers; use base qw(My::Class::DBI::Subclass); __PACKAGE__->table('mailservers'); __PACKAGE__->columns(Primary => qw(ID)); __PACKAGE__->columns(Essential => qw(MTA version)); Package My::WebServers; use base qw(My::Class::DBI::Subclass); __PACKAGE__->table('webservers'); __PACKAGE__->columns(Primary => qw(ID)); __PACKAGE__->columns(Essential => qw(httpd version CGI mod_perl port https)); #### my $webserver = My::WebServers->retrieve($id); my $version = $webserver->version; my $ip = $webserver->host->IPAddress; my @mailservers_on_this_host = $webserver->host->mailservers; my @hosts_with_webservers = map { $_->host } My::WebServer->retrieve_all; my @same thing = grep { $_->webservers } My::Hosts->retrieve_all; # ... #### Package My::Hosts; use base qw(My::Class::DBI::Subclass); __PACKAGE__->table('hosts'); __PACKAGE__->columns(Primary => qw(ID)); __PACKAGE__->columns(Essential => qw(name IPAddress location OS)); __PACKAGE__->columns(mailserver => qw(MTA version)); __PACKAGE__->columns(webserver => qw(httpd version CGI)); __PACKAGE__->make_filter(mailservers => 'not MTA is NULL'); __PACKAGE__->make_filter(webservers => 'not httpd is NULL');