SPOPS provides a nice interface to wrapping your database up in objects. However, learning how to use SPOPS from its lacking documentation can require re-reading the documentation many times, then resorting to reading the source code, and perhaps experimenting a bit. Once you figure it out, its pretty great.
SPOP(S) security portion is mediocre. It works -ok- for small sites and databases with simple sets of relationships. As soon as you have a sizeable database, however, it generates soo much database traffic that your application can become incredibly unresponsive and slow while waiting for the hundreds of database queries per single access finish.
If you need a database abstraction tool, and you need a security tool, use SPOPS for the former, and find some other way of dealing with the latter.
I like it. Some of the documentation is out of date or misleading and I think this tool is *really* hard to get into, compared to Class::DBI or Alzabo. However, I think it's overall the most flexible and powerful of that trio. The extensibility of the system is it's strongest point. With just a bit of code you can add whole new classes of generic functionality--a nifty feature, SPOPx::Ginsu, for example. It's documentation is it's weakest point, I had to read the code a few times to understand what was going on and found a couple sticky spots where it contradicts itself (particularly about "object rules").
I've tried various persistence mechanisms in the past but SPOPS for me comes out on top. At first glance the documentation makes it seem a little daunting, but with a bit of persistence (no pun intended) you get to see what SPOPS is really about. What I found was a library that let's me easily set up object persistence but at the same time is highly configurable. Performance seems to be pretty good too. The only downside is the documentation - there is so much of it that the lack of a proper index can sometimes make stuff hard to find. Otherwise a very complete tool which I can highly recommend.
There's lots of documentation but it is not as good as it seems - a lot of the basics are hidden and there's nowhere which explains the concepts well. There are problems with record caching which means that it is easy to accidentally overwrite your own changes; and the interface forces you to choose between editing object properties direct, or having undefined method calls interpreted as property get/setters, with unfortunate results for speed of debugging. I'd suggest trying one of the alternatives (Class::DBI, Alzabo, Tangram etc.)