in reply to Recursive use causes subroutine redefinition

Nothing is wrong with your recursive uses; the problem is that you are also loading as a script, bypassing the multiple load checks that exist for require or use. The same thing happens without the recursion:
$ cat> package Baz; use strict; use warnings; use Baz; sub baz { } 1; $ perl Subroutine baz redefined at line 5.
If you are going to use the same file both via use or require and as a main script or via do, you should manually put a "BEGIN { $INC{} ||= __FILE__ }" in before any possible use/require.