Another way of exporting symbols
package MyModule::HTTP; use Exporter::Tidy default => [ qw(get) ], other => [ qw(post head) ]; use MyModule::HTTP qw(:all); use MyModule::HTTP qw(:default post); use MyModule::HTTP qw(post); use MyModule::HTTP _prefix => 'http_', qw(get post); use MyModule::HTTP qw(get post), _prefix => 'http_', qw(head); use MyModule::HTTP _prefix => 'foo', qw(get post), _prefix => 'bar', qw(get head); package MyModule::Foo; use Exporter::Tidy default => [ qw($foo $bar quux) ], _map => { '$foo' => \$my_foo, '$bar' => \$my_bar, quux => sub { print "Hello, world!\n" } }; package MyModule::Constants; use Exporter::Tidy default => [ qw(:all) ], _map => { FOO => sub () { 1 }, BAR => sub () { 2 }, OK => sub () { 1 }, FAILURE => sub () { 0 } };
This module serves as an easy, clean alternative to Exporter. Unlike Exporter, it is not subclassed, but it simply exports a custom import() into your namespace.
With Exporter::Tidy, you don't need to use any package global in your module. Even the subs you export can be lexically scoped.
The list supplied to \*(C`use Exporter::Tidy\*(C' should be a key-value list. Each key serves as a tag, used to group exportable symbols. The values in this key-value list should be array references. There are a few special tags:
If you don't provide an \*(C`all\*(C' tag yourself, Tidy::Exporter will generate one for you. It will contain all exportable symbols.
The \*(C`default\*(C' tag will be used if the user supplies no list to the \*(C`use\*(C' statement.
With _map you should not use an array reference, but a hash reference. Here, you can rewrite symbols to other names or even define one on the spot by using a reference. You can \*(C`foo => 'bar'\*(C' to export \*(C`bar\*(C' if \*(C`foo\*(C' is requested.
Every symbol specified in a tag's array, or used as a key in _map's hash is exportable.
You can export subs, scalars, arrays, hashes and typeglobs. Do not use an ampersand (\*(C`&\*(C') for subs. All other types must have the proper sigil.
You can use either a symbol name (without the sigil if it is a sub, or with the appropriate sigil if it is not), or a tag name prefixed with a colon. It is possible to import a symbol twice, but a symbol is never exported twice under the same name, so you can use tags that overlap. If you supply any list to the \*(C`use\*(C' statement, \*(C`:default\*(C' is no longer used if not specified explicitly.
To avoid name clashes, it is possible to have symbols prefixed. Supply \*(C`_prefix\*(C' followed by the prefix that you want. Multiple can be used.
use Some::Module qw(foo bar), _prefix => 'some_', qw(quux);
imports Some::Module::foo as foo, Some::Module::bar as bar, and Some::Module::quux as some_quux. See the \s-1SYNOPSIS\s0 for more examples.
Exporter::Tidy \*(L"versus\*(R" Exporter
These numbers are valid for my Linux system with Perl 5.8.0. Your mileage may vary.
Exporting two symbols using no import list (@EXPORT and :default) is approximately 10% faster with Exporter. But if you use any tag explicitly, Exporter::Tidy is more than twice as fast (!) as Exporter.
perl -le'require X; print((split " ", `cat /proc/$$/stat`)[22])'
No module 3022848 Exporter::Tidy 3067904 Exporter 3084288 Exporter::Heavy 3174400
Exporter loads Exporter::Heavy automatically when needed. It is needed to support exporter tags, amongst other things. Exporter::Tidy has all functionality built into one module.
Both Exporter(::Heavy) and Exporter::Tidy delay loading Carp until it is needed.
Exporter is subclassed and gets its information from package global variables like @EXPORT, @EXPORT_OK and %EXPORT_TAGS.
Exporter::Tidy exports an \*(C`import\*(C' method and gets its information from the \*(C`use\*(C' statement.
Pick your favourite \s-1OSI\s0 approved license :)
http://www.opensource.org/licenses/alphabetical
Thanks to Aristotle Pagaltzis for suggesting the name Exporter::Tidy.
Juerd Waalboer <[email protected]> <http://juerd.nl/>