Como redefinir os métodos de classe Perl? <, / A>

A questão "Como posso corrigir um método de instância no Perl?" me fez pensar. Posso redefinir dinamicamente os métodos Perl? Digamos que eu tenha uma classe como esta:

package MyClass;
sub new {
  my $class = shift;
  my $val = shift;
  my $self = { val=> $val};

  bless($self, $class);
  return $self;
};

sub get_val {
  my $self = shift;
  return $self->{val}+10;
}
1;

E digamos que adicionar dois números é realmente car

Gostaria de modificar a classe para que $ val + 10 seja computado apenas na primeira vez em que chamo o método nesse objeto. Chamadas subsequentes ao método retornariam um valor em cach

Eu poderia modificar facilmente o método para incluir o cache, mas:

Tenho vários métodos como est Prefiro não sujar esse métod

O que eu realmente quero fazer é especificar uma lista de métodos que eu sei que sempre retornam o mesmo valor para uma determinada instância. Desejo pegar essa lista e passá-la para uma função para adicionar suporte a cache para esses métodos

Existe uma maneira eficaz de conseguir isso?

Acompanhamento. O código abaixo funciona, mas como use strict não permite referências por string, não estou 100% onde quero estar.

sub myfn {
  printf("computing\n");
  return 10;
}
sub cache_fn {
  my $fnref = shift;

  my $orig = $fnref;
  my $cacheval;

  return sub {
    if (defined($cacheval)) { return $cacheval; }
    $cacheval = &$orig();
    return $cacheval;
  }
}

*{myfn} = cache_fn(\&myfn);

Como faço para modificar para fazer isso:

cache_fn(&myfn);

questionAnswers(5)

yourAnswerToTheQuestion