package Woeisme; use strict; local $^W = 1; use vars qw ($VERSION ); $VERSION = 0.01; use Carp; my %default_values = ( SUBJECT => 'Subject (<= 44 characters) goes here', AUTHOR => { NAME => 'A. U. Thor', CPANID => 'AUTHOR', WEBSITE => 'http://a.galaxy.far.far.away/modules', EMAIL => 'a.u.thor@a.galaxy.far.far.away', }, ); sub new { my ($class, %parameters) = @_; my $self = ref($class) ? bless( \%default_values, ref($class) ) : bless( \%default_values, $class ); foreach my $param ( keys %parameters ) { if ( ref( $parameters{$param} ) eq 'HASH' ) { foreach ( keys( %{ $parameters{$param} } ) ) { $self->{$param}{$_} = $parameters{$param}{$_}; } } else { $self->{$param} = $parameters{$param}; } } $self->verify_values(); return ($self); } sub verify_values { my $self = shift; my (@errors); push( @errors, 'NAME is required' ) unless ( $self->{NAME} ); push( @errors, 'Module NAME contains illegal characters' ) unless ( $self->{NAME} and $self->{NAME} =~ m/^[\w:]+$/ ); push( @errors, 'SUBJECTs are limited to 44 characters' ) if ( length( $self->{SUBJECT} ) > 44 ); push( @errors, 'CPAN IDs are 3-9 characters' ) if ( $self->{AUTHOR}{CPANID} !~ m/^\w{3,9}$/ ); push( @errors, 'EMAIL addresses need to have an at sign' ) if ( $self->{AUTHOR}{EMAIL} !~ m/.*\@.*/ ); push( @errors, 'WEBSITEs should start with an "http:" or "https:"' ) if ( $self->{AUTHOR}{WEBSITE} !~ m/https?:\/\/.*/ ); if (@errors) { croak( join "\n", @errors, '', $!); } } 1; #### # -*- perl -*- # t/001_load.t - check module loading and create testing directory use Test::More qw{no_plan}; BEGIN { use_ok( 'Woeisme' ); } BEGIN { use_ok( 'File::Temp', qw| tempdir |); } BEGIN { use_ok( 'Cwd' ); } my $object = Woeisme->new ( 'NAME' => 'ABC::XYZ', ); isa_ok ($object, 'Woeisme'); failsafe( [ 'NAME' => 'ABC::XYZ', 'SUBJECT' => '123456789012345678901234567890123456789012345', ], "^SUBJECTs are limited to 44 characters", "Constructor correctly failed due to SUBJECT > 44 characters"); failsafe( [ 'NAME' => 'GHI::DEF', 'AUTHOR' => { NAME => 'James E Keenan', CPANID => 'ABCDEFGHIJ', }, ], "^CPAN IDs are 3-9 characters", "Constructor correctly failed due to CPANID > 9 characters"); sub failsafe { my ($argslistref, $pattern, $message) = @_; my $odir = cwd(); my ($tdir, $mod); $tdir = tempdir( CLEANUP => 1); ok(chdir $tdir, 'changed to temp directory for testing'); local $@ = undef; eval { $mod = Woeisme->new (@$argslistref); }; like($@, qr/$pattern/, $message); local $@ = undef; ok(chdir $odir, 'changed back to original directory after testing'); } #### CPAN IDs are 3-9 characters #### SUBJECTs are limited to 44 characters CPAN IDs are 3-9 characters