NAME thanks - inline packages easily SYNOPSIS BEGIN { package My::Package; no thanks; # everything else goes here }; use My::Package; # No error message about missing # file "My/Package.pm". # Or: BEGIN { package My::Package; # everything else goes here }; no thanks qw( My::Package Another::Package Yet::Another::Package ); use My::Package; # No error message about missing # file "My/Package.pm". # ELEVATOR PITCH Defining multiple Perl packages in the same file can be fraught with difficulty. `no thanks` makes it a bit easier. To define a package just do... BEGIN { package My::Package; no thanks; # everything else goes here }; Then everything should more or less work exactly if My::Package had been a package defined in an external file and loaded like: use My::Package (); (The exception being that the inlined My::Package can see file-scoped lexicals.) Why define multiple packages in the same file? Because often namespacing concerns and code organisation concerns don't align. For example, you have many small packages which it is important don't share namespaces, but you want to be able to edit them all in the same window/tab of your editor. DESCRIPTION This module asks Perl politely not to load a module you don't want loading. It's just a polite request; we're not forcing Perl to do anything it doesn't want to. And if the module is already loaded, then we won't try to unload it or anything like that. Specifically, Perl's `use Module::Name` syntax does two things. It reads, compiles and executes `Module/Name.pm`, and calls the class method `Module::Name->import`. This module is designed to prevent the first thing happening, not the second thing. How does it work? Perl keeps a record of what modules have already been loaded in the %INC global hash, to avoid reloading them. This module just adds an entry to that hash to trick Perl into thinking that a module has already been loaded. `thanks` is a deliberately light-weight module. It has no dependencies (not even strict or warnings) and is believed to work in any release of Perl 5. (The installation and testing scripts have more dependencies, but if push comes to shove, you can manually copy thanks.pm to an appropriate location.) Methods `unimport` no thanks @LIST; If @LIST is empty, then the caller package is assumed. Use Case 1: Multiple Packages in the Same File Perl's `use` keyword muddies the distinction between packages (which are just namespaces) and modules (which are just files). Sometimes you wish to define two packages (say `My::Package` and `My::Package::Helper`) in the same file (say `My/Package.pm`). If anybody tries to load `My::Package::Helper` with `use`, then they'll get an error message. If `My/Package.pm` includes: no thanks 'My::Package::Helper'; then this will prevent `use My::Package::Helper` from throwing an error message, provided `My/Package.pm` is already loaded. Use Case 2: You Really Want to Prevent a Module from Loading It's quite a messy thing to do, but if you really need to silently prevent a module from being loaded, then `no thanks` will do the trick. Just make sure you do it early. This is almost always a bad idea. BUGS Please report any bugs to . SEE ALSO again, Module::Reload, Class::Unload. AUTHOR Toby Inkster . COPYRIGHT AND LICENCE This software is copyright (c) 2012-2013 by Toby Inkster. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. DISCLAIMER OF WARRANTIES THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.