in reply to Re: Module forwarding
in thread Module forwarding

As far as using @INC: We want to do that with a single repository... Our format is that each lib lives in its own versioned directory -- and each directory is owned by a team member, and we have about 30 such directories... So having them individually in the path is inconvenient. We could centralize the mechanism to create @INC -- which should reduce headaches when a file upgrade occurs. Indeed, that's the motivation for centralizing them via symlinks. Each module is also run-able to provide self-tests and documentation. I had hope there was a standard CPAN solution for this... at the moment mucking around with require/import/do to see if I can hack it out......

Replies are listed 'Best First'.
Re^3: Module forwarding
by afoken (Chancellor) on Feb 06, 2012 at 16:21 UTC

    That concept lacks an installer. Perl has standard mechanisms for installing modules, ExtUtils::MakeMaker is the oldest one, Module::Build is newer, several others attempt to improve various details. But the best: All of these can be used by the various CPAN modules to install modules from a repository into a running system.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
Re^3: Module forwarding
by Anonymous Monk on Feb 06, 2012 at 16:37 UTC
    .. this isn't looking very easy... My problem is that it seems to depend on whether the forwarded module uses "export" or not....
      package ForwardSimpleModule; require Exporter; @ISA = qw(Exporter); use constant FORWARDED => 'SimpleModule'; require do { FORWARDED . '.pm' }; warn; sub import { warn; my $exporter = FORWARDED . "->export_to_level(2, @_)"; my $simple = FORWARDED . "->import(@_)"; eval $exporter; eval $simple if $@; }
      The above demonstration seems to work where exporter is used and where it isn't and import doesn't require details about the caller. BUT: I still can't get it so that the forwarders filename is the same as the underlying pm and use "use" -- I think import get overwritten in the package namespace. (hence the introduction of ForwardSimpleModule namespace)

        Why do you want to lie about the filename? This will make debugging your construct horribly bad, as you can't be sure which file to open to find the root cause of a warning or a crash.

        See perlsyn about comments. The following code should show you how to make Perl claim and a module believe it is loaded from another file:

        eval qq[\n#line 2001 ""\ndie 'foo']; print $@;

        You might also want to set up %INC appropriately.