Criação de Métodos em Runtime
Num módulo é útil, por vezes, gerar métodos dinamicamente (em runtime). O Perl, por ser uma linguagem reflexiva, torna essa tarefa muito simples.
No LaTeX::Writer::Simple, um módulo de que sou autor, uso geração dinâmica de métodos para vários comandos LaTeX. Segue-se um walkthrough.
@EXPORT = (qw/document p/);
Estes são os métodos convencionais, que são definidos no módulo.
sub _def {
my ($name, $sub) = @_;
no strict 'refs';
my $x = "LaTeX::Writer::Simple::$name";
*$x = $sub;
push @EXPORT, $name;
}
Este método _def é usado para definir um método em runtime: recebe o nome do método, e uma referência para um método anónimo. O que a função faz é criar um blob para o nome desse método (neste caso no módulo LaTeX::Writer::Simple), e associar-lhe a função. Por questões de princípio, o nome do método também é colocado no array de métodos exportados.
Assim, torna-se simples definir métodos em tempo de execução, como no código seguinte:
my @nl_commands = (qw/part chapter section subsection subsubsection caption/);
for my $c (@nl_commands) {
_def($c, sub { _c($c, @_)."\n" });
}
Já agora, _c é um método convencional usado para simplificar a escrita destas funções.
Num módulo é útil, por vezes, gerar métodos dinamicamente (em runtime). O Perl, por ser uma linguagem reflexiva, torna essa tarefa muito simples.
No LaTeX::Writer::Simple, um módulo de que sou autor, uso geração dinâmica de métodos para vários comandos LaTeX. Segue-se um walkthrough.
@EXPORT = (qw/document p/);
Estes são os métodos convencionais, que são definidos no módulo.
sub _def {
my ($name, $sub) = @_;
no strict 'refs';
my $x = "LaTeX::Writer::Simple::$name";
*$x = $sub;
push @EXPORT, $name;
}
Este método _def é usado para definir um método em runtime: recebe o nome do método, e uma referência para um método anónimo. O que a função faz é criar um blob para o nome desse método (neste caso no módulo LaTeX::Writer::Simple), e associar-lhe a função. Por questões de princípio, o nome do método também é colocado no array de métodos exportados.
Assim, torna-se simples definir métodos em tempo de execução, como no código seguinte:
my @nl_commands = (qw/part chapter section subsection subsubsection caption/);
for my $c (@nl_commands) {
_def($c, sub { _c($c, @_)."\n" });
}
Já agora, _c é um método convencional usado para simplificar a escrita destas funções.