# from Matisse Enzer
# on Friday 14 March 2008 12:20:

>and when you see a  
>"use" statement, you know what the corresponding package is, and have
>   a good clue about the path path of the file you are importing.

Well, a "use" statement literally defines the name of the file (per 
`perldoc -f require`), but also the package of the import() method.

While one *can* have a package name which doesn't match the file path, 
the 'use' statement still has to point at the file -- but that sort of 
inner switcharoo is extremely non-discoverable and is likely to lead to 
puzzling:

  # loads package Deal, but calls Foo::Bar->import()
  use Foo::Bar;

  # much, much later ...
  my $thing = Deal->new;

By "discoverable", I mean that when a constructor is called on a class, 
I expect to be able to hit '*' in vim and soon find a corresponding
'use' or 'require' statement.  This also ties to the rule of least 
surprise.

Now, the "Foo/Bar.pm contains Foo::Bar and Foo::Bar::Whatever" issue is 
slightly different.  I would call that situation acceptable, but 
typically as an interim measure -- and generally only to the extent 
that Foo::Bar::Whatever does not, in itself, have much importance or 
require easily accessible documentation (that is:  when it has
"importance", you probably want `perldoc Foo::Bar::Whatever` to work.)

Aside: I have often wished that base.pm had simply said eval("require 
$base") and been done with it (instead of all this mincing %{"$base::"} 
stuff (not to mention the timidity about $SIG{__DIE__} again.))  That 
would at least have made the error message much less ambiguous.

--Eric
-- 
But as soon as you hear the Doppler shift dropping in pitch, you know
that they're probably going to miss your house, because if they were on
a collision course with your house, the pitch would stay the same until
impact. As I said, that one's subtle.
--Larry Wall
---------------------------------------------------
    http://scratchcomputing.com
---------------------------------------------------

Reply via email to