in reply to Re: Refactoring a module with many anonymous subrefs as an OO module
in thread Refactoring a module with many anonymous subrefs as an OO module

Wow, that's exactly what I was missing - I did NOT know that!

In my case, the anonymous subs are part of package Foo. So to provide some sort of interface and access them from outside the package, is this the best way?
#!/usr/bin/perl use strict; use warnings; { package Foo; our %HASH; $HASH{blah} = sub { my $self = shift; print $self->{value}; }; sub new { bless { crefs => \%HASH, value => 'telcontar' } => shift + } sub access { my $self = shift; my $coderef = $self->{crefs}{+shift}; $self->$coderef(@_) } } my $x = Foo->new; $x->access('blah');
Thanks!
-- telcontar
  • Comment on Re^2: Refactoring a module with many anonymous subrefs as an OO module
  • Download Code

Replies are listed 'Best First'.
Re^3: Refactoring a module with many anonymous subrefs as an OO module
by Ovid (Cardinal) on Nov 21, 2007 at 20:13 UTC

    That's certainly better than the 1,1 you were passing earlier. You could also iterate over the hash and build up accessors.

    while ( my ( $name, $code ) = each %hash ) { no strict 'refs'; *$name = $code; }

    And then you could just call:

    $x->blah;

    That provides a couple of advantages. First, you don't have to remember to check if the key in the hash exists (as I forgot to do in my example to you). Second, you can gain a limited bit of introspection:

    if ( my $method = $x->can('blah') ) { $x->$method; }

    However, beyond your example, I don't really know what your needs are, so this may not work for you.

    Cheers,
    Ovid

    New address of my CGI Course.

      Thanks a lot. You were of immense help.

      -- telcontar