in reply to Calling functions from different namespaces

Well ... the way you've coded things, TT::s1() calls TT::s2(). If you don't want TT::s2() to be called then you need to either:
a) not call TT::s1(), or;
b) rewrite TT::s1() in such a way that it accommodates the possible existence of main::s2() - for example (in TT.pm):
sub s1 { print "s1"; if(defined(&main::s2)) {main::s2()} else {s2()} }
See perldoc -f defined

Cheers,
Rob