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