Exporter::Tidy - 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 use Exporter::Tidy
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 all
tag yourself, Tidy::Exporter will generate one for you. It will contain all exportable symbols.
The default
tag will be used if the user supplies no list to the use
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 foo => 'bar'
to export bar
if foo
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 (&
) 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 use
statement, :default
is no longer used if not specified explicitly.
To avoid name clashes, it is possible to have symbols prefixed. Supply _prefix
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 SYNOPSIS for more examples.
Exporter::Tidy "versus" 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 import
method and gets its information from the use
statement.
This software may be redistributed under the terms of the GPL, LGPL, modified BSD, or Artistic license, or any of the other OSI approved licenses listed at http://www.opensource.org/licenses/alphabetical. Distribution is allowed under all of these licenses, or any smaller subset of multiple or just one of these licenses.
When using a packaged version, please refer to the package metadata to see under which license terms it was distributed. Alternatively, a distributor may choose to replace the LICENSE section of the documentation and/or include a LICENSE file to reflect the license(s) they chose to redistribute under.
Thanks to Aristotle Pagaltzis for suggesting the name Exporter::Tidy.
Juerd Waalboer <juerd@cpan.org> <http://juerd.nl/>