Modelo de classes Perl

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 AUTOLOADsub), dinâmico adição de propriedades ( *Animal::DESTROY = sub {}), sobrecarga do operador (consulte o overloadpragma 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.