On Fri, Jun 20, 2008 at 01:45:41PM +0100, Ovid wrote:

> 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:
> 
>   use Test::Most plan => 3, '+set';
> 
> Are there better strategies?

How about just disabling all default exports - so ignore @EXPORT and
only look at @EXPORT_OK.  Whichever way you go, how about calling it
Import instead of Export, to signify that the *importer* controls
what's happening.  A module using this might look like ...

package MyModule;

use Import; # does Magick to make Exporter not work in anything called
            # from here

use Module::That::Exports::Stuff; # except that now it doesn't, bwahahahaha!

Import::import(
    from => 'Module::That::Exports::Stuff',
    subs => [qw(set get bet wet)]
);

-- 
David Cantrell | top google result for "internet beard fetish club"

Just because it is possible to do this sort of thing
in the English language doesn't mean it should be done

Reply via email to