Class::Entity - Object interface for relational databases
Class::Entity allows a developer to create an object interface for a relational database by writing a minimal amount of code in a set of sub-classes which correspond to database tables.
Right now this module only implements a read only interface. Writes will probably come later.
package Table; use base qw(Class::Entity); package main; use DBI; my $dbh = DBI->connect(...); my $table = Table->fetch(dbh => $dbh, key => 1234); print $table->Column; for (Table->find(dbh => $dbh, where => "Name like 'foo%'")) { printf "% %\n", $table->Name, $table->Date; }
The constructor creates a new instance of the current class. If you pass in values via data they will be stored in the object for later use.
Return the primary key for the table the current sub-class of Class::Entity represents. You will normally want to overide this in the sub-class but for convenience it returns id by default.
The value of this method is used to create the query that is run when a call to fetch is made.
Return the name of the table the current sub-class of Class::Entity represents. You will normally want to overide this in the sub-class but for convenience it returns the final part of the sub-class name; that is: the sub-class name minus the leading /.*:/.
This method provides the sub-class author a means of joing accross multiple tables when a call to fetch or find is made. All database fields returned via these methods are stored in an instance of the current sub-class and exposed via the autoloader. By default it returns all fields in the current table represented by the sub-class.
The object map works in conjuction with the autoloader. If you have sub-classes of Class::Entity, which represent tables linked to in the current sub-class, you can overload this method to return a hash where the keys are the table columns and the values are the names of the associated Class::Entity sub-classes.
The object map will only be used for method calls of the form get_Value.
Here's an example:
package Users; use base qw(Class::Entity); package Departments; use base qw(Class::Entity); sub _object_map({ UserID => "Users" }) package main; use DBI; my $dbh DBI->connect(...); my @support = Departments->find(dbh => $dbh, where => "Name = 'Support'"); for (@support) { printf "%s %s\n", $_->UserID, $_->get_UserID->name; }
Return an instance of the current sub-class. You must provide a database value via dbh and a primary key value via key. The database handle is stored in the returned object for later use and all table fields are exposed via the auoloader.
Return an array in array context, or the first item of the array in scalar context, of instances of the current sub-class based on the query modifier passed in via where. You must pass in a database handle via dbh which will be stored in the returned instances for later use.
The autoloader provides get and set methods for the table values represented in an instance of the current sub-class. For example, if you have a table with the fields: Name, Date, Subject, you would access them like this:
package Table; use base qw(Class::Entity); package main; use DBI; my $dbh = DBI->connect(...); my $table = Table->fetch(dbh => $dbh, key => 10); print $table->Name . "\n"; print $table->Date . "\n"; print $table->Subject . "\n";
If you call an anonymous method of the form get_Value, where Value is a column represented by the current object, the autoloader will attempt to dispatch the call to the fetch method of the corresponding sub-class of Class::Entity, if it's listed in the _bject_map.
DBI
Paddy Newman, <pnewman@cpan.com>
This is basically a cut-down, slightly modified version of something an ex-colegue of mine wrote and introduced me to. His name is Dan Barlow and he's a much better programmer than me and he deserves all the credit.
To install Class::Entity, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Class::Entity
CPAN shell
perl -MCPAN -e shell install Class::Entity
For more information on module installation, please visit the detailed CPAN module installation guide.