An introduction to object oriented Perl

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.