Problem: you have some kind of data that needs to be distributed with your Perl module. Where do you put it in a cross-platform way?
Solution #1: Put it in a giant datastructure inside some module. This ends up with a big .pm file that chews up memory.
Solution #2: Put it in a __DATA__ section. But you only get one of those per module, and binary data might get hairy.
Best solution: File::ShareDir.
If you’ve ever looked through your Perl module directory, you’ve no doubt seen a directory called ‘auto’. This was used for a few different autoloading systems, but there’s no reason you can’t use it for your own module.
When I added SDL navigation data output to UAV::Pilot, the text overlayed on the screen needed a specific font. SDLx::Text can take a path to a TrueType font file, but where do you put that file?
The answer is that you create a ‘share/’ directory in your project and drop it in. The files there will be placed in your module’s ‘auto/’ entry. You can then get the path to the file with:
use File::ShareDir 'dist_dir'; use File::Spec; my $dir = dist_dir( 'UAV-Pilot' ); my $file = File::Spec::catfile( $dir, 'font.ttf' );
Thus providing a safe, cross-platform way of storing module files.