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');