I have a object that contains a list of things. How new things are put into that list is important. In fact it might depend upon what is in the list. So I am giving the user the option of passing in a function ref. This will allow the user to decide if the thing to be put into the list should be "push"'ed in, "unshift"'ed in or spliced in or whatever.
I know there are other ways to do this, so this problem is not preventing me from developing the object the way I want it but I thought it was really strange that I couldn't just make a reference to "push". I mean really... of all the things that could happen... I can't make a reference to "push"!?
--habit | [reply] |
Ah, see, now that's a slightly different question now. You need all the possible functions being passed in to have the same signature, which means that you can't just pass in references to push, unshift and splice - since splice has a different signature than push and unshift.
Since you need to come up with a common signature anyway, then using closures is probably the easiest way:
sub do_stuff
{
my $determine_what_to_do = shift;
foreach (@some_other_list)
{
my $func = $determine_what_to_do->($_);
$func->($_) if $func;
}
}
And then you can have a determination function that does the lookup on what to do with each line - if source filters were reliable, Switch probably would be good here. The perl6 match operators will probably be even better. Here you can return a closure that only takes the item to be pushed, unshifted, spliced, whatever, and closes on the rest of the parameters (which array to push, etc.).
Or, your call to the function could be:
$func->(\@array, $_);
if the same array is always used anyway. Again, though, the splice function needs more parameters, which will need to be closed on somehow.
| [reply] [d/l] [select] |
Sorry. Perhaps (most likely?) Perl 6 will allow you to do this. You can fake it with:
my $push = sub { my $aref = shift; push @$aref, @_ };
but that's probably not the cool solution you sought.
| [reply] [d/l] |