Meu modelo anterior para JavaScript já teve dois votos positivos, então escrevi um segundo modelo para linguagem em que as classes também podem ser confusas para usuários de programação orientada a objetos clássicos – Perl.
O Perl OOP é muito flexível nos bastidores – ele suporta herança múltipla (corda suficiente para se enforcar) que pode ser alterada a qualquer momento (na verdade, a corda é muito longa), chamando métodos que não existem (usando AUTOLOAD
sub), dinâmico adição de propriedades ( *Animal::DESTROY = sub {}
), sobrecarga do operador (consulte o overload
pragma para obter detalhes). Para simplificar, esses recursos não são discutidos, mas você pode encontrá-los na documentação do Perl.
use strict;
use warnings;
# say function
use 5.010;
# Class Animal
package Animal {
sub new {
# You should always use current class to help
# inheritance.
my ($class, $name) = @_;
# Constructor
my $self = {};
$self->{name} = $name;
# In Perl, objects are references to Perl data
# structures which were associated with a
# particular class.
return bless $self, $class;
}
sub move {
my $self = shift;
my ($meters) = @_;
say "$self->{name} moved ${meters}m.";
}
}
# Class Snake
package Snake {
# Following statement would be needed if class is
# Animal.pm (it should be, but to make example simpler
# it isn't).
# use Animal;
# List of objects from which Snake inherits. Can be
# modified dynamically.
our @ISA = qw( Animal );
sub move {
# $self needs to be shifted to avoid two objects in
# arguments when calling SUPER (usually not what
# you want).
my $self = shift;
say "Slithering...";
$self->SUPER::move(@_);
}
}
# use Snake;
# Don't type "new Snake", this syntax works only because of
# Indirect Object Syntax. Don't use this feature as it
# could be easily broken.
# http://perldoc.perl.org/perlobj.html#Indirect-Object-Syntax
Snake->new('Sammy the Python')->move(5);
Se você ainda achar este modelo muito confuso, muitos programadores Perl criaram vários sistemas OO para tornar a programação OOP mais fácil.