PGObject
PGObject is a module intended to be a base for object class frameworks which map
PostgreSQL stored procedures to object methods in a relatively loosely coupled
way. PGObject provides the bare-bones infrastructure required to make it
happen. This module is primarily of interest to individuals writing such
frameworks, and very little in here is likely to be used directly outside of
such frameworks.
The initial release, 1.0.0 is based on our six years of experience using
essentially the same approach in LedgerSMB (starting with the beginnings of the
1.3 codebase in 2007). This release is largely based on the code I wrote for
LedgerSMB but it cleans up and refactors such work based on the lessons learned.
INSTALLATION
To install this module, run the following commands:
perl Makefile.PL
make
make test
make install
SUPPORT AND DOCUMENTATION
After installing, you can find documentation for this module with the
perldoc command.
perldoc PGObject
You can also look for information at:
RT, CPAN's request tracker (report bugs here)
http://rt.cpan.org/NoAuth/Bugs.html?Dist=PGObject
AnnoCPAN, Annotated CPAN documentation
http://annocpan.org/dist/PGObject
CPAN Ratings
http://cpanratings.perl.org/d/PGObject
Search CPAN
http://search.cpan.org/dist/PGObject/
WRITING PGOBJECT-AWARE PERL CLASSES
One of the powerful features of PGObject is the ability to declare methods in
types which can be dynamically detected and used to serialize data for query
purposes. Objects which contain a pgobject_to_db(), that method will be called
and the return value used in place of the object. This can allow arbitrary
types to serialize themselves in arbitrary ways.
For example a date object could be set up with such a method which would export
a string in yyyy-mm-dd format. An object could look up its own definition and
return something like :
{ cast => 'dbtypename', value => '("A","List","Of","Properties")'}
If a scalar is returned that is used as the serialized value. If a hashref is
returned, it must follow the type format:
type => variable binding type,
cast => db cast type
value => literal representation of type, as intelligible by DBD::Pg
WRITING TOP-HALF OBJECT FRAMEWORKS FOR PGOBJECT
PGObject is intended to be the database-facing side of a framework for objects.
The intended structure is for three tiers of logic:
1. Database facing, low-level API's
2. Object management modules
3. Application handlers with things like database connection management.
By top half, we are referring to the second tier. The third tier exists in the
client application.
The PGObject module provides only low-level API's in that first tier. The job
of this module is to provide database function information to the upper level
modules.
We do not supply type information, If your top-level module needs this, please
check out https://code.google.com/p/typeutils/ which could then be used via our
function mapping APIs here.
LICENSE AND COPYRIGHT
Copyright (C) 2013 Chris Travers
Redistribution and use in source and compiled forms with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code (Perl) must retain the above
copyright notice, this list of conditions and the following disclaimer as the
first lines of this file unmodified.
* Redistributions in compiled form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
source code, documentation, and/or other materials provided with the
distribution.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.