Don't make the short-sighted mistake of discounting SQL::Abstract, because it doesn't do everything you need. While you can do joins, SQL::Abstract really shines in the generation of straight SQL for a single table. Since it takes simple (or complex) data structures as parameters, it is perfect for programatically generating SQL statements for select,update, insert, and delete queries. By using SQL::Abstract to generate SQL for all of my non-ClassDBI/DBIx::Class classes, I now have a consistent interface for all of my searching routines.
Love it! And, yes, we could put together a whole book of examples of how to use it. The syntax does get a little crazy when you want to do more -- especially with boolean logic.
I've been very happy using cgiapp for at least 5 years, since I interviewed with Jesse and he asked me to use it to build some sample apps. Using the cgiapp approach, you can build web apps with discrete and specific functionality encapsulated in separate methods of your cgiapp subclass for each run mode. It's a must-have for web developement for me, and works great with mod_perl.