Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
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;
        }
}
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
Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
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 meditating upon the Monastery: (7)
As of 2023-10-04 13:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?