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; }