in reply to Write a Perl module from scratch

Don't follow this guide. h2xs is no longer the best way to start pure-perl modules. Use something like Module::Starter instead.

Replies are listed 'Best First'.
Re^2: Write a Perl module from scratch
by BrowserUk (Patriarch) on Oct 14, 2008 at 02:03 UTC
      It's more up-to-date with current practices for CPAN. It can generate Module::Build support, makes better starter tests, generates the YAML file, has stub POD that's more useful for modern OO modules, etc. h2xs also generates some strange file layouts, as discussed here in the past.
Re^2: Write a Perl module from scratch
by educated_foo (Vicar) on Oct 14, 2008 at 03:53 UTC
    Better yet, if you want to write more than about 2 modules, just write your own. h2xs adds more useless junk with every Perl release, and Module::Starter seems no better. When you write your own, you type in all and only the boilerplate you want when you write it, and you don't have extraneous garbage inserted when you create future modules. Here's what I use:
    #!/usr/bin/env perl use Getopt::Long; $ME = q|WHATEVER|; sub usage { print STDERR <<'EOS'; Usage: newmod.pl [-u 'Name <user@host>'] Module::Name EOS exit 1; } GetOptions('user:s' => \$ME) && @ARGV == 1 or usage; $mod = shift; ($dir = $mod) =~ s/::/-/g; mkdir $dir or die $!; chdir $dir; sub cat { my $o = shift; open OUT, ">$o" or die $!; print OUT $_ for @_; close OUT; } ($file = $mod) =~ s/.*:://; cat 'Makefile.PL', <<EOS; use ExtUtils::MakeMaker; WriteMakefile( NAME => '$mod', VERSION_FROM => '$file.pm', PREREQ_PM => { }, (\$] >= 5.005 ? ## Add these new keywords supported since 5.00 +5 (AUTHOR => q|$ME|) : ()), ABSTRACT => 'Something.', ); EOS cat "$file.pm", <<EOS; package $mod; =head1 NAME $mod -- Whatever it does... =head1 SYNOPSIS =cut \$VERSION = '0.01'; 1; __END__ =head1 DESCRIPTION =head1 AUTHOR ${ME} Bug reports welcome, patches even more welcome. =head1 COPYRIGHT Copyright (C) $y $ME. All rights reserved, some wrongs reversed. This module is distributed under the same terms as Perl itself. =cut EOS cat "test.pl", <<EOS; use Test::Simple tests => 1; use $mod; ok(1, 'loaded'); EOS (undef, undef, undef, $d, $m, $y) = localtime; $y += 1900; cat "ChangeLog", <<EOS; $y-$m-$d $ME * original version; created by newmod.pl EOS cat "README", <<EOS; $mod version 0.01 INSTALLATION To install this module, run the following commands: perl Makefile.PL make make test make install DEPENDENCIES COPYRIGHT AND LICENSE Copyright (C) $y, $ME This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. EOS cat 'MANIFEST', <<EOS; Makefile.PL MANIFEST README test.pl $file.pm EOS
      That looks fine, but Module::Starter is totally customizable. Search CPAN for examples of what others have done.
        Yikes! Still, this was only 123 lines of code that took me less than an hour to write. It would probably take me at least as much time just to read and understand Module::Starter's docs, or to figure out which of the custom extensions is closest to what I want and to customize it. I still think your best bet is to run "h2xs -AXn," delete the junk you don't need, and create a script to produce the stuff that is left.