I think you're not following OOP too close. I would change it to something like this (untested):
sub new {
my ($class, %parameters) = @_;
my $self = {};
# here we check required parameters, to croak() them. since we are
+ using
# OOP, we *need* to ensure this object will be complete to perform
+ whatever
# operations, avoiding coupling.
foreach (qw(cardnum)) { # maybe we have other required parameters
croak "Required parameter '$_' not found"
unless exists $parameters{$_};
}
# now we set defaults for not obligatory parameters
$self->{'tail'} = $parameters{'tail'} || -4;
$self->{'head'} = $parameters{'head'} || 0;
$self->{'replacement'} = $parameters{'replacement'} || "*";
}
sub obscure {
my ($self) = @_;
my $obscured = substr($self->{'cardnum'},
$self->{'head'},
$self->{'tail'}
) =~ s/./$self->{'replacement'}/g;
return $obscured;
}
Hope this helps.
Igor 'izut' Sutton
your code, your rules.