in reply to Understanding order of module compilation and execution

If ModA uses ModB and ModB uses ModA, you'll have problems exporting symbols. The best way I've found is to do:
# ModA.pm use strict; use warnings; package ModA; BEGIN { our @ISA = qw( Exporter ); our @EXPORT_OK = qw( ... ); require Exporter; } use This; use ModB; use That; ... 1;
# ModB.pm use strict; use warnings; package ModB; BEGIN { our @ISA = qw( Exporter ); our @EXPORT_OK = qw( ... ); require Exporter; } use This; use ModA; use That; ... 1;

Otherwise, things usually work out fine.