On Fri, Jul 16, 2021 at 8:57 AM David Christensen <dpchr...@holgerdanske.com> wrote:
> module-authors: > > I have extended EUMM in a Perl distribution by implementing a module > that overrides various methods in the "MY" package namespace and by > using that MY override module in Makefile.PL, per "Overriding MakeMaker > Methods" in: > > https://metacpan.org/pod/ExtUtils::MakeMaker > > > I would like to split the single distribution into multiple > distributions. Multiple distributions will have a MY override module. > A given MY method may be implemented in multiple modules. A given > Makefile.PL may 'use' one or more modules. Method name collisions are > expected. I will architect the distributions to avoid circular > dependencies. > > > AIUI simply use'ing modules with the same package namespace and the same > subroutine (method) names will result in later definitions redefining > earlier definitions, generating compiler warnings and making the earlier > definitions inaccessible. > > > Is there a mechanism to daisy-chain multiple package::subroutine > definitions such that a MY method call by EUMM will return the > concatenated results of all definitions? > > > David > In general, I don't think it's a good idea for any module to add methods to MY:: directly (or at least not by default), exactly for that reason. MY should only live in Makefile.PL. For methods without side-effects on $self, combining them is could be done like this: my @extensions = (...); load($_) for @extensions; my @methods = map { $_. "::postamble" } @extensions; sub MY::postamble { my ($self, %args) = @_; return join "\n\n", map { $self->$_(%args) } @methods; } Another alternative is to insert yourself in the inheritance tree between MY:: and whatever happens to be its base-class ($MY::ISA[0]), so you can chain them. This may work better with side-effects. Leon