Estimable Monks,
For brevity in code, I've been using some aliases of the
following form in the main namespace of a project:
#### Main.pm
package main;
*tn = \%Track::by_name;
*ti = \%Track::by_index;
*bn = \%Bus::by_name;
print $tn{Master}->name # Master
Up to now, I used 'our' to give all packages
access to these aliases via the main namespace:
#### ChainSetup.pm
package main;
our (%tn, %ti, %bn);
package ChainSetup;
my $master_fader = $tn{Master};
But now, I am refactoring this to use Exporter.
#### Globals.pm
package Globals;
use Exporter;
our @ISA = 'Exporter';
our @EXPORT_OK = qw( %tn %ti %bn);
#### Main.pm
use Globals qw(%tn %ti %bn);
*tn = \%Track::by_name;
*ti = \%Track::by_index;
*bn = \%Bus::by_name;
#### ChainSetup.pm
package ChainSetup;
use Globals qw(%tn %ti %bn);
print $tn{Master}->name; # can't do method 'name' on undef
I'm looking for a way to create these aliases in each
namespace without using boilerplate. I'd like
use Globals to accomplish this.
I tried some code like this:
#### Globals.pm
package Globals;
use Exporter;
our @ISA = 'Exporter';
our @EXPORT_OK = qw( %tn %ti %bn);
my $pkg = caller();
my $code = '*' . $pkg . '::tn = \%Track::by_name';
eval $code;
die "error: $@ in eval of code: $code" if $@;
However, executing
use Globals does not appear
to provide the package name to
caller() in Globals.pm.
I hope this explanation is sufficiently intelligible, and
would be grateful for any advice you may have.