NAME Class::PObject - Simple framework for programming persistent objects SYNOPSIS After loading Class::PObject with "use", we can declare a class: pobject Person => { columns => ['id', 'name', 'email'], datasource => './data' }; We can also declare the class in its own .pm file: package Person; use Class::PObject; pobject { columns => ['id', 'name', 'email'], datasource => './data' }; We can now create an instance of above Person, fill it with data, and save it: $person = new Person(); $person->name('Sherzod'); $person->email('sherzodr[AT]cpan.org'); $new_id = $person->save() We can access the saved Person later, make necessary changes and save back: $person = Person->load($new_id); $person->name('Sherzod Ruzmetov (The Geek)'); $person->save() We can load multiple objects as well: @people = Person->load(); for $person ( @people ) { printf("[%02d] %s <%s>\n", $person->id, $person->name, $person->email) } or we can load all the objects based on some criteria and sort the list by column name in descending order, and limit the results to only the first 3 objects: @people = Person->load( {name => "Sherzod"}, {sort => "name", direction => "desc", limit=>3}); We can also seek into a specific point of the result set: @people = Person->load(undef, {offset=>10, limit=>10}); DESCRIPTION Class::PObject is a simple class framework for programming persistent objects in Perl. Such objects can store themselves into disk, and restore themselves from disk. PHILOSOPHY This section has been moved to Class::PObject::Philosophy. TODO Class::PObject is not a tool for solving all the problems of the Universe. It may be its success rather than its failure. I still want it to do certain things, for I believe they are right down its alley. * Multiple object joins Currently "load()" and "fetch()" methods are used for querying a single object. It would be ideal if we could select multiple objects at a time through some *join* syntax. * Column Indexes While RDBMS drivers do not need this, db_file, csv and file drivers will not be suitable for production environment until they do. Column indexes are needed to retrieve more complex queries much faster, without having to perform linear search. With aforementioned drivers (especially file and csv) once number of records increases, querying objects gets extremely processor intensive if more complex "load()" and "fetch()" methods are used. * SET Column types Currently column types can be configured to be of *HAS-A* relationship. It would be great if we could specify *HAS-MANY* relationships. Following syntax is still to be implemented: pobject Article => { columns => ['id', 'title', 'authors'], tmap => { authors => ['Author'] } }; Notice, *authors* field is set to be able to hold an array of *Author* objects. NOTES Pobjects try to cache the driver object for more extended periods than pobject's scope permits them to. So a *global destructor* should be applied to prevent unfavorable behaviors, especially under persistent environments, such as mod_perl Global variables that *may* need to be cleaned up are: $Class::PObject::Driver::$drivername::__O Where "$drivername" is the name of the driver used. If more than one driver is used in your project, more of these variables may exist. This variable holds particular driver object. $ClassName::props Holds the properties for this particular PObject named "$ClassName". For example, if you created a pobject called *Person*, then it's properties are stored in global variable "$Person::props". For example, if our objects were using just a mysql driver, in our main application we could've done something like: END { $Class::PObject::Driver::mysql::__O = undef; } DRIVER SPECIFICATIONS You can learn more about pobject driver specs in the following manuals: Class::PObject::Driver Base pobject driver specification. All the drivers are expected to inherit from this class. Class::PObject::Driver::DBI Base pobject driver for all the DBI-related drivers. This inherits from Class::PObject::Driver, but re-defines certain methods with those more relevant to DBI drivers. Class::PObject::Driver::DBM Base pobject driver for all the DBM-related drivers. It inherits from Class::PObject::Driver, and re-defines certain methods with those more relevant to DBM COLUMN TYPE SPECIFICATIONS You can learn more about column type specs from Class::PObject::Type, which is also a base class of all the types. SEE ALSO http://poop.sourceforge.net/, although little dated, provides brief overview of available tools for programming Persistent Objects in Perl. As of this writing, Class::PObject is still not mentioned. AUTHOR Sherzod B. Ruzmetov, , http://author.handalak.com/ COPYRIGHT AND LICENSE Copyright (c) 2003 Sherzod B. Ruzmetov. All rights reserved. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. $Date$