User Tools

Site Tools


perl:runtimemethods

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.

Alberto Simões: 2008/07/10 13:50

perl/runtimemethods.txt · Last modified: 2008/07/10 21:50 by ambs