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

Reply via email to