http://www.perlmonks.org?node_id=291486

Closures are like objects, but with only one method. Here is a way that sort of gets around that limitation. This example is pretty bland, but you get the idea (exchange keys for methods).

If you prefer $object->{method}() syntax, you can use a hash reference instead of hash.
my $object = {};
%$object = constructor();

#!/usr/bin/perl -w use strict; my %object = constructor(); $object{save}->('name' => 'smith'); print $object{count}->(), $/; my $name = $object{lookup}->('name'); $object{delete}->('name'); print $object{count}->(), $/; print "My name is $name\n"; sub constructor { my %object; return 'save' => sub { my ($key, $val) = @_; die "save method requires two parameters" if ! defined $va +l; $object{$key} = $val; return; }, 'delete' => sub { my $key = shift; return delete $object{$key}; }, 'lookup' => sub { my $key = shift; return $object{$key}; }, 'count' => sub { return scalar keys %object; } }

Replies are listed 'Best First'.
Re: Multi-Method closures
by bart (Canon) on Sep 15, 2003 at 13:32 UTC
    It somewhat reminds me of Gnat's slides of the JAPH 2000 talk "Stages of a Perl programmer", especially "OOP without objects". Coincidence, I'm sure. :)

    BTW I think the code in that slide has a memory leak. There seem to be circular references from $person to the subs, and back.

    OTOH, yours doesn't, as you don't actually use the hash outside the closures.

      bart,
      Sort of, but I can say in all honesty that I didn't even get the idea, let alone any code, from those slides.

      As best as I can decipher the slides:

    • An anonymous hash is set up with a couple special keys
    • These keys are code refs that alter the hash itself
    • I think you would need a "method" key as an accessor/mutator for each "regular" key. If not, you could wipe out your own methods
    • You mentioned in the CB here that you thought this might be a memory leak (circular references) - I think the possibility exists

      My approach doesn't have the drawbacks of the last two points. Additionally, you can add additional lexicals in my technique as a way to add "pieces" to the pseudo object, so you are not limited to a single hash.

      Cheers - L~R

Re: Multi-Method closures
by Felonious (Chaplain) on Sep 15, 2003 at 15:20 UTC