Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Multi-Method closures

by Limbic~Region (Chancellor)
on Sep 15, 2003 at 03:58 UTC ( #291486=snippet: print w/ replies, xml ) Need Help??

Description: 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;
        }
}
Comment on Multi-Method closures
Download Code
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

Back to Snippets Section

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: snippet [id://291486]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (6)
As of 2015-07-04 02:02 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (57 votes), past polls