Interface versus implementation
The Name class re-implemented
package Name;
sub new {
my $class = shift;
return bless [], $class;
}
sub firstName {
my ( $self, $firstName ) = @_;
$self->[ 0 ] = $firstName if defined $firstName;
return $self->[ 0 ];
}
sub lastName {
my ( $self, $lastName ) = @_;
$self->[ 1 ] = $lastName if defined $lastName;
return $self->[ 1 ];
}
sub fullName {
my $self = shift;
return $self->firstName() . " " . $self->lastName();
}
Any script using Name would notice no different - the interface is unchanged.
fullName also didn't need to be changed, because it used the class's interface too.