Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re: Re: Callback Design

by MeowChow (Vicar)
on Jan 16, 2001 at 04:47 UTC ( [id://52120]=note: print w/replies, xml ) Need Help??


in reply to Re: Callback Design
in thread Callback Design

Impressively diry and nasty :) What I'm looking for is a way to keep the anonymous sub the same, and override it's package when it is called. The idea is to have callback params readily available as package variables.

I believe the Safe module could do this, but it seems like terrible overkill.

Replies are listed 'Best First'.
Re: Re: Re: Callback Design
by saucepan (Scribe) on Jan 16, 2001 at 05:10 UTC
    Hmm. Let me see if I understand: you want to be able to do something like grep or map, where your code gets passed a subref which you then call back?

    If so, you don't need to worry about changing packages at the time you call it, since it will have already picked up the proper package when it was defined (and compiled) in the caller's code:

    package my; $global = 'in_my'; sub own_map(&@) { my $code = shift; my @return = (); push @return, $code->() for @_; @return; } package main; $global = 'in_main'; print my::own_map { $_, " ", $global, "\n" } (1..20); # prints "1 in_main\n", "2 in_main\n" and so on
    In the above code, my::own_map could have molested ${ (caller)[0] . "::global" } to pass a value in to the block. I guess this might be OK (although it's clearly an abuse of caller, which AFAIK was intended for debugging), as long as it's well documented and you are careful to localize everything.

    Updated: removed a confusing and unneeded $_ argument on the line that calls the callback. Oops!

      Ah, you just showed me something cool, that I can do without the 'sub' declaration if I prototype the callback-setter.

      But I guess I'm not being very clear as to my primary objective. I would like to have something like the following:

      package MyModule; my $callback; sub set_callback { $callback = shift; } sub exec_callback { # the next three lines don't work, but they are indicative of what I + would like # to see happen... i want $name, $street, $city, $zip to be made ava +ilable as package # globals to the anonymous callback sub... in other words, I don't w +ant the callback # to execute in it's own package, I want it to execute in MyModule:: +ThrowAway package MyModule::ThrowAway; our ($name, $street, $city, $zip) = @_; &$callback(); package MyModule } package main; # set callback to check that name and zip are both correctly formatted # notice that callback sub assumes that $name and $zip have been set f +or it, not # passed in @_ # MyModule::set_callback(sub { $name =~ /^[a-zA-Z\s]+$/ and $zip /^\d+$/ + }) MyModule::exec_callback('Bob', '600 1st St.', 'Beverly Hills', 90210);
      Now that I think about it, this could never work under use strict, since $name and $zip are undeclared at the time the callback sub is formed.

      update: cleared up a few confusing things in my code

        Is there some reason why you couldn't just have your module export the variables you'd like to expose to it's users? :)

        package MyModule; use vars qw(@ISA @EXPORT_OK $name $street $city $zip); BEGIN { @ISA = qw(Exporter); @EXPORT_OK = qw($name $street $city $zip); require Exporter; } my $callback; sub set_callback(&) { $callback = shift } sub exec_callback { local(($name, $street, $city, $zip) = @_); $callback->(); } package Main; BEGIN { import MyModule qw($name $street $city $zip) } MyModule::set_callback { $name =~ /^[a-zA-Z\s]+$/ and $zip =~/^\d+$/ } +; MyModule::exec_callback('Bob', '600 1st St.', 'Beverly Hills', '90210' +) and print "Record is valid.\n";
        Once MyModule was moved into it's own file, you could replace the ugly BEGIN { import ... } line with just use MyModule qw($name $street $city $zip).

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others taking refuge in the Monastery: (7)
As of 2024-04-19 08:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found