package ODB; use Moose; use DBI; use vars qw( $conn ); use vars qw( $debug_level ); $ODB::debug_level = 3; =item ODB::load($dsn); Load the given DSN. That is, go through each table and try to create a class in the ODB:: namespace. =cut sub load { my ($dsn, %attr) = @_; ODB::debug(1,"ODB: Loading $dsn"); # First lets try to set up this connection and save it $conn = DBI->connect($dsn) or croak($DBI::errstr); debug(1,"ODB: Got $dsn $DBI::errstr"); my ($driver) = $dsn =~ m/^dbi:(\w*?)(?:\((.*?)\))?:/i; my $impl = "ODB::Load::$driver"; eval "use $impl"; die "Couldn't require loader class '$impl', '$@'" if $@; my $loader = $impl->new(conn => $conn); return $loader->load($dsn); } =item $classname = ODB::get_classname($table_name) Given a table's name, return the full generated class name =cut sub get_classname { my ($table_name) = @_; my $class_name = "ODB::" . ucfirst($table_name); return $class_name; } =item $classname = ODB::create_class($table_name) Given a table's name, create the class including inheritence and such =cut sub create_class { my ($table_name) = @_; my $class_name = get_classname($table_name); eval qq| package $class_name; use strict; use warnings; use base 'ODB::Table'; package ${class_name}::Field; use strict; use warnings; use base 'ODB::Table::Field'; 1; |; warn $@ if $@; $class_name->table_name($table_name); return $class_name; } sub debug { my ($level, $message) = @_; if($level <= $debug_level) { print STDERR "ODB($level): $message\n"; } } 1;