[Pdx-pm] fun with import()

Eric Wilhelm scratchcomputing at gmail.com
Sun Aug 6 15:48:12 PDT 2006


# from chromatic
# on Sunday 06 August 2006 01:45 pm:

>        use UNIVERSAL 'isa';
>...
>... and pretend as if isa() and can() are functions.

Justifiable finger-wagging aside, is that the only "historical accident" 
part of it?  If so, that is fixable.

Is anyone relying on Foo->import() landing in UNIVERSAL::import()?  I 
would say it would be fair enough to break it.

>The comment in UNIVERSAL.pm reads:
>        # The use of Exporter below is a historical
>        # accident that can't be fixed without breaking code.

Roughly:

  # can/t.pm
  package can::t;
  require UNIVERSAL;
  require Exporter;
  *UNIVERSAL::import = sub {
    my $self = shift;
    ($self eq 'UNIVERSAL') or return; # should we goto somewhere?
    @_ or return;
    carp("chromatic said to stop it (and tell your friends)");
    Exporter::import($self, @_);
  };

We'll have to work on the edge cases of storing an intentionally 
installed UNIVERSAL::import (but maybe anyone doing that should `use 
can't "don't";` or something.)  And, I guess `no can't` might also be 
in order because sometimes it helps to have enough rope to shoot 
yourself in the foot with.

>I did fix the documentation in bleadperl to suggest therapy instead of
>importing isa() and can(); I'm not sure if it went into maintperl at
> some point.

Just breaking it might get their attention.

  $ perldoc -f use | grep -A 1 'If no "import"'
  ...  If no "import" method can be found then the call is
  skipped.

IMO, that pod is much more visible than an "I wish this weren't so" 
comment.

--Eric
-- 
Chicken farmer's observation:  Clunk is the past tense of cluck.
---------------------------------------------------
    http://scratchcomputing.com
---------------------------------------------------


More information about the Pdx-pm-list mailing list