When I first discovered Devel::DProf I fell in love with it not once, but twice.
First and foremost there was the profiling functionality that I've since replaced with the far superior and not-bit-rotted Devel::NYTProf.
But the second really useful feature was the C command, which took the function call tree and printed it out. This made for a really easy way to debug a programs internals, because you could filter the (gigantic) function tree output and see when and where various interesting functions were called.
Aspect::Library::Trace is partial replacement for this functionality.
It replaces a debugger-level internals hooking of all function calls with an Aspect-controllable selective hook (Aspect implements "Aspect Oriented Programming" concepts, which at it's core is a fancy structured wrapper for Hook::LexWrap.
To use it, you just do something like the following in your top level script (after you have loaded the modules you care about).
aspect Trace => call qr/^Foo::/;
A function tree of all modules described in the pointcut (that would be the qr/^Foo::/ bit) will be printed to STDERR.
I've been finding this particularly useful for debugging things like where different DBI code gets called from, and whether or not caching code is working the way I expect it to.
After finding it too hard to type three lines, I've also added support for a simple one-line form.
use Aspect::Library::Trace qr/^Foo::/;