On 3/13/22 13:13, David Christensen wrote:
> I have been wrestling with the Exporter module and subroutine circular
> dependencies between modules for a number of years.
https://www.mail-archive.com/module-authors@perl.org/msg10914.html
We revisited this topic at a San Francisco Perl Mongers meeting today:
https://mail.pm.org/pipermail/sanfrancisco-pm/2022-June/004851.html
I showed the following snippet of code that demonstrates the solution I
am currently using:
6 package Dpchrist::Lib5::Test;
7
8
9 use strict;
10 use warnings;
11 use threads;
12 use threads::shared;
13
14 our @EXPORT_OK;
15
16 BEGIN {
17 @EXPORT_OK = qw(
18 is_poly
19 );
20 }
21
22 use parent qw(
23 Exporter
24 Test::Builder::Module
25 );
The key points are:
* Put the Exporter-related statements (lines 14-25) near the top of the
module, before other code.
* Statement ordering is important:
* First -- declare @EXPORT_OK, but do not define/ initialize it (line
14).
* Next -- define/ initialize @EXPORT_OK in a BEGIN block (lines 16-20).
* Finally -- 'use parent' to inherit from Exporter (lines 22, 23, and
25).
* The above module also happens to inherit from Test::Builder::Module.
My other modules do not need or have line 24.
* As I develop code and introduce bugs, I frequently see warnings to the
effect "subroutine redefined" when there is a circular loop between
modules. Once I fix the bugs, those warnings go away.
Without understanding the "how" and "why" of perl(1), Exporter, "compile
time", "run time", "require", "use", "parent", "import", etc. -- of the
several solutions myself and others have tried over time, this one seems
to work the best for me.
David