On 3/13/22 15:08, Diab Jerius via module-authors wrote:
On 3/13/22 16:13, David Christensen wrote:module-authors:I have been wrestling with the Exporter module and subroutine circular dependencies between modules for a number of years. I have yet to find a satisfactory solution.
If you move import of modules with circular dependencies to runtime rather than compile time:$ diff Exporter-circular-use{.orig,.new} diff Exporter-circular-use.orig/Bar11.pm Exporter-circular-use.new/Bar11.pm 13c13,14 < use Foo11; --- > require Foo11; > Foo11->import; diff Exporter-circular-use.orig/Foo11.pm Exporter-circular-use.new/Foo11.pm 13c13,14 < use Bar11; --- > require Bar11; > Bar11->import; $ perl Exporter-circular-use.t ok 1 - foo00 ok 2 - foo01 ok 3 - foo10 ok 4 - foo11 1..4
Thank you for the reply. :-) Yes, that works.
Or move the export completely into compile time: $ diff Exporter-circular-use{.orig,.new} diff Exporter-circular-use.orig/Bar11.pm Exporter-circular-use.new/Bar11.pm 9,11c9,11 < require Exporter; < our @ISA = qw( Exporter ); < our @EXPORT = qw( bar ); --- > use parent 'Exporter'; > our @EXPORT; > BEGIN{ @EXPORT = qw( bar ); } diff Exporter-circular-use.orig/Foo11.pm Exporter-circular-use.new/Foo11.pm 9,11c9,11 < require Exporter; < our @ISA = qw( Exporter ); < our @EXPORT = qw( foo ); --- > use parent 'Exporter'; > our @EXPORT; > BEGIN { @EXPORT = qw( foo ); }
Yes, that also works. Putting the @EXPORT allocation and initialization in a BEGIN block ahead of the 'use parent' looks even better:
2022-03-13 18:15:46 dpchrist@tinkywinky ~/samba/dpchrist/sandbox/perl/Exporter-circular-use
$ diff Foo11.pm Foo33.pm 1c1 < package Foo11; --- > package Foo33; 9,11c9,10 < require Exporter; < our @ISA = qw( Exporter ); < our @EXPORT = qw( foo ); --- > BEGIN { our @EXPORT = qw( foo ) } > use parent 'Exporter'; 13c12 < use Bar11; --- > use Bar33; David2022-03-13 18:38:24 dpchrist@tinkywinky ~/samba/dpchrist/sandbox/perl/Exporter-circular-use
$ cat /etc/debian_version ; uname -a ; perl -v | head -n 2 9.13Linux tinkywinky 4.9.0-17-amd64 #1 SMP Debian 4.9.290-1 (2021-12-12) x86_64 GNU/Linux
This is perl 5, version 24, subversion 1 (v5.24.1) built for x86_64-linux-gnu-thread-multi
2022-03-13 18:40:00 dpchrist@tinkywinky ~/samba/dpchrist/sandbox/perl/Exporter-circular-use
$ ./Exporter-circular-use.t ok 1 - foo00 ok 2 - foo01 ok 3 - foo10 Undefined subroutine &Bar11::foo called at Bar11.pm line 22. not ok 4 - foo11 # Failed test 'foo11' # at ./Exporter-circular-use.t line 24. # got: 'main=7 # foo=6 # bar=5 # ' # expected: 'main=7 # foo=6 # bar=5 # foo=4 # bar=3 # foo=2 # bar=1 # ' Undefined subroutine &Bar12::foo called at Bar12.pm line 23. not ok 5 - foo12 # Failed test 'foo12' # at ./Exporter-circular-use.t line 24. # got: 'main=7 # foo=6 # bar=5 # ' # expected: 'main=7 # foo=6 # bar=5 # foo=4 # bar=3 # foo=2 # bar=1 # ' ok 6 - foo21 ok 7 - foo22 ok 8 - foo33 1..8 # Looks like you failed 2 tests of 8.
Exporter-circular-use-20220313-181541.tar.gz
Description: application/gzip