Hmm. I seem to have misunderstood your problem. The stuff below remains true but to be relevant to you mail, should include stuff about subclasses. The principle is that same, changing what you export based on something other than what the importer is requesting will cause mysterious breakage,
F 2008/6/20 Fergal Daly <[EMAIL PROTECTED]>: > 2008/6/20 Ovid <[EMAIL PROTECTED]>: >> Buried deep within some code, someone used a module (Test::Most 0.03) >> which exports a 'set' function. They weren't actually using that >> module. It was just leftover cruft. Unfortunately, the parent class >> of that module inherited from Class::Accessor. >> >> Test::Most exports 'set' and Class::Accessor calls a 'set' method. >> Oops. >> >> I'm trying to think of the best way to deal with this. My first >> thought is to create a drop in replacement for Exporter which will not >> export a function if caller->can($function) *unless* the person >> explicitly lists it in the import list with a unary plus: > > # 2008 > use Foo; # exports nothing > use Bar; # exports set with Exporter::Safe > > set() # Bar > > # 2009 after upgrading some modules > use Foo; # new version in 2009 exports set > use Bar; # exports set with Exporter::Safe > > set() # now Foo and triggers rm -rf / :) > > > Of course switching the order of imports gives the problems without > Exporter::Safe. > > The upshot is that I believe there is no such thing as safe default > exports. Python gets this right with > > import Foo > import Bar > > Bar.set() # always works no matter what Foo suddenly starts doing. > > It deals with long package names by doing > > from Stupid.Long.Package import Name > Name.Foo > > So, what would be interesting would be to find a way to bring the > short name in my current namespace ebenefits of Python to Perl and > abandon default exports entirely, > > F > >> use Test::Most plan => 3, '+set'; >> >> Are there better strategies? >> >> Cheers, >> Ovid >> >> -- >> Buy the book - http://www.oreilly.com/catalog/perlhks/ >> Personal blog - http://publius-ovidius.livejournal.com/ >> Tech blog - http://use.perl.org/~Ovid/journal/ >> >