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


in reply to Old Code reference wants new life as Object.

Your question sounds somewhat interesting, but -- as the previous two replies indicate -- it is a bit vague. After reading it I am left with a few questions.

Do you want to:

And do you need help:

As you can see, there are many different directions this could go. Maybe one of the previous responses answered the question for you, but maybe not. Perhaps if you could clarify your question, we could be more certain.

  • Comment on Re: Old Code reference wants new life as Object.

Replies are listed 'Best First'.
Re^2: Old Code reference wants new life as Object.
by Devanchya (Beadle) on Dec 08, 2006 at 19:04 UTC
    Thanks for the responces... I am trying to maintain the depatch table at this time, as it is integrated into the main program preety heavly. If there is a better way to do it with out loosing the dynamic option, then that most likely would work. I considered using inheritance etc but it didn't work right for the option.

    Right now each of the existing plugin's have a load section which loads a code reference into a global dispatch hash:
    $dispatch{login} = \&login;
    $dispatch{slogin} = \&secure_login;
    The script then uses a value of a specific varible to determin what to do.
    $dispatch{default} = \&show_option_menu; #if nothing else we will show the menu

    $dispatch->{$dothis_now}->() # does the code ref.

    Now as you can tell, doing a code ref with \&login for example will work. It will not run the code when loaded into the hash, and waits nicely until it is wanted.

    $dispatch{self_test} = $self->login;

    Will execute the code before it is placed in the hash.

    I have not yet tested the other options given, but will as soon as I'm next to my development machine. But hopefully this clears it up a bit.

    It may be both the calling and the plugin code need to be 'fixed' to work properly.

    --

    Even smart people are dumb in most things...

      In that case, the easiest thing to do is probably:

      $dispatch{self_test} = sub { $self->login };

      This will create an anonymous code reference that makes a closure on $self, so everything should be in place when the code actually gets called.

      Update: Er, which is exactly what ikegami responded with. I guess I should have re-read the original replies before posting.