autodie icon indicating copy to clipboard operation
autodie copied to clipboard

Exclude functions from importing

Open berekuk opened this issue 12 years ago • 5 comments

It would be nice to have a syntax for importing "all functions except one". Exporter.pm does this with '!' syntax, but unfortunately it's already taken by autodie::hints. How about '-'? So, use autodie qw(:all -read) would import everything except read.

This effect is hard to achieve by other means, see https://gist.github.com/2901998 for my attempts to avoid prototype conflicts with a method named read.

berekuk avatar Jun 11 '12 13:06 berekuk

I'm currently at YAPC, but just as a quick check, does the following work for you?

use autodie;
no autodie qw(read);

pjf avatar Jun 13 '12 21:06 pjf

No, it removes my method for some reason:

mmcleric@domU-12-31-39-0A-60-DD:~$ cat X.pm
package X;

use strict;
use warnings;

use autodie;
no autodie qw(read);

sub read {
    print "foo\n";
}

1;
mmcleric@domU-12-31-39-0A-60-DD:~$ perl -e 'use X; X->read'
Can't locate object method "read" via package "X" at -e line 1.

berekuk avatar Jun 13 '12 21:06 berekuk

I hit this as well (have a module with a connect() method that is getting clobbered). I'd like what berekuk suggested would be great.

use autodie qw/ :all -connect /;

mla avatar Apr 10 '14 09:04 mla

Oh, dang.

I agree, autodie qw/ :all -connect /; would be great.

In the tradition of short responses, I'm on the way to KiwiFoo right now, but nudging me in 6-7 days time should reach me in a quiet spot. Alternatively, if you fancy a patch to Fatal::_translate_import_args, I'd be delighted to receive it (especially if it comes with test cases)!

~ pjf

pjf avatar Apr 10 '14 11:04 pjf

I did a bit more poking around and I see what's happening. autodie is doing its work before the user-supplied method is defined which is why unimport is failing. Here's an ugly work-around:

#!/usr/bin/env perl

package Foo;

use strict;
use warnings;

INIT {
  require autodie;
  autodie->import(':all');
  autodie->unimport('connect');
}

sub connect {
  warn "MY CONNECT!\n";
  return;
}

Foo->connect;

With that, we're delaying the autodie setup until after the rest of the code has been defined, which allows unimport to work as expected.

I'll look at putting together a patch for the -connect syntax. There's no way to have autodie automatically delay it's execution until the current file is compiled, is there?

mla avatar Apr 11 '14 01:04 mla