Tidy(3pm)

✨ NAME ✨

Exporter::Tidy β€” literally another way of exporting symbols πŸ’… (this is the page for Tidy(3pm), from the User Contributed Perl Documentation, bestie)


🌸 SYNOPSIS 🌸

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 }
    };

πŸ¦‹ DESCRIPTION πŸ¦‹

okay so this module is the easy, clean alternative to Exporter πŸ’–. Unlike Exporter, it does not get subclassed β€” instead it just exports a custom import() straight into your namespace. iconic behavior, honestly.

And the best part? With Exporter::Tidy, you don't need to use any package global in your module. Not even one. Even the subs you export can be lexically scoped. no cap. 🫢

πŸŽ€ use Exporter::Tidy LIST

The list you hand to use Exporter::Tidy should be a key-value list, periodt. Each key is a tag, used to group your exportable symbols together. And the values in this key-value list should be array references. There are a few special tags you gotta know about:

  • all β€” if you don't provide an all tag yourself, Tidy::Exporter will generate one for you ✨. It contains all the exportable symbols.
  • default β€” this tag gets used when the user supplies no list to the use statement.
  • _map β€” for _map you should not use an array reference, bestie, use a hash reference. Here you can rewrite symbols to other names, or even define one on the spot by using a reference. You can do foo => 'bar' to export bar if foo is requested πŸ’«.

🌈 Exportable symbols

Every symbol that's specified in a tag's array β€” or used as a key in _map's hash β€” is exportable. that's it, that's the list.

πŸ’œ Symbol types

You can export subs, scalars, arrays, hashes and typeglobs πŸ”₯. Do not use an ampersand (&) for subs. All other types must have the proper sigil. (yes this matters, don't come for me.)

🧚 Importing from a module that uses Exporter::Tidy

You can use either a symbol name (without the sigil if it's a sub, or with the appropriate sigil if it's not), or a tag name prefixed with a colon ✨.

It's possible to import a symbol twice, but a symbol is never exported twice under the same name β€” so you can totally use tags that overlap, no drama 🫢. And if you supply any list to the use statement, :default is no longer used unless you specify it explicitly. she said what she said.

To avoid name clashes, it's possible to have symbols prefixed πŸ’…. Supply _prefix followed by the prefix that you want. Multiple can be used, go off:

use Some::Module qw(foo bar), _prefix => 'some_', qw(quux);

This imports Some::Module::foo as foo, Some::Module::bar as bar, and Some::Module::quux as some_quux ✨. See the SYNOPSIS for more examples, bestie.


πŸ‘‘ COMPARISON πŸ‘‘

Exporter::Tidy "versus" Exporter

These numbers are valid for my Linux system with Perl 5.8.0. Your mileage may vary 🌸.

⚑ Speed

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. not me being shook 😭

🧠 Memory usage

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's 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. efficient queens πŸ’….

🌟 Usage

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. that's the whole vibe ✨.


πŸ“œ LICENSE πŸ“œ

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.


πŸ™ ACKNOWLEDGEMENTS πŸ™

Thanks to Aristotle Pagaltzis for suggesting the name Exporter::Tidy 🫢. chef's kiss naming, fr fr.


πŸ’Œ AUTHOR πŸ’Œ

Juerd Waalboer <juerd@cpan.org> <http://juerd.nl/>


and that's the whole page, bestie πŸŽ€ 🩷 this was Tidy(3pm) from the User Contributed Perl Documentation, perl v5.40.0, dated 2024-09-21. go forth and export slayfully πŸ’…βœ¨

πŸ“¦ where this page comes from