¿Cómo invoco un nombre de función que está almacenado en un hash en Perl?

Estoy seguro de que esto está cubierto en la documentación en algún lugar pero no he podido encontrarlo ... Estoy buscando el azúcar sintáctico que hará posible llamar a un método en una clase cuyo nombre está almacenado en un hash ( a diferencia de un simple escalar):

use strict; use warnings;

package Foo;
sub foo { print "in foo()\n" }

package main;
my %hash = (func => 'foo');

Foo->$hash{func};

Si copio$hash{func} en una variable escalar primero, luego puedo llamarFoo->$func bien, pero que falta para habilitarFoo->$hash{func} ¿trabajar?

(EDITAR: No quiero hacer nada especial llamando a un método en claseFoo - esto podría ser fácilmente un objeto bendito (y en mi código real lo es); fue más fácil escribir un ejemplo autónomo utilizando un método de clase.)

EDIT 2: solo para completar los comentarios a continuación, esto es lo que realmente estoy haciendo (esto es en una biblioteca de azúcar de atributo de alce, creado conAlces :: Exportador):

# adds an accessor to a sibling module
sub foreignTable
{
    my ($meta, $table, %args) = @_;

    my $class = 'MyApp::Dir1::Dir2::' . $table;
    my $dbAccessor = lcfirst $table;

    eval "require $class" or do { die "Can't load $class: $@" };

    $meta->add_attribute(
        $table,
        is => 'ro',
        isa => $class,
        init_arg => undef,  # don't allow in constructor
        lazy => 1,
        predicate => 'has_' . $table,
        default => sub {
            my $this = shift;
            $this->debug("in builder for $class");

            ### here's the line that uses a hash value as the method name
            my @args = ($args{primaryKey} => $this->${\$args{primaryKey}});
            push @args, ( _dbObject => $this->_dbObject->$dbAccessor )
                if $args{fkRelationshipExists};

            $this->debug("passing these values to $class -> new: @args");
            $class->new(@args);
        },
    );
}

He reemplazado la línea marcada arriba con esto:

        my $pk_accessor = $this->meta->find_attribute_by_name($args{primaryKey})->get_read_method_ref;
        my @args = ($args{primaryKey} => $this->$pk_accessor);

PD. Acabo de darme cuenta de que esta misma técnica (usar la meta clase Moose para buscar el código en lugar de asumir su convención de nomenclatura)no poder también ser utilizado para predicados, comoClase :: MOP :: Atributo no tiene un similarget_predicate_method_ref accesor :(

Respuestas a la pregunta(3)

Su respuesta a la pregunta