Seems like you could roll your own
UNIVERSAL::do to get pretty close to your second want.
use strict;
use warnings;
package UNIVERSAL;
# Couldn't decide which syntax would be more likeable.
sub do {
my $ob = shift;
my $method = shift;
$ob->$method(@_);
}
sub do2 {
my $ob = shift;
my $method = shift;
sub { $ob->$method(@_) };
}
package U;
sub voo {
my $ob = shift;
print "Called with @_\n";
}
sub new {
return bless {};
}
package main;
my $foo = U->new();
$foo->do('v'.'oo', 1..3);
$foo->do2('v'.'oo')->(1..3);
Not really profound, but it gives me an excuse to say, "Now go do that $foo->do that U::do so well!"
Update: lodin points out that this is pretty close to UNIVERSAL::can. Which it is. Except you'd have to put the object back in the arg list:
$foo->do2('v'.'oo')->($foo,1..3);
Ugh.
Caution: Contents may have been coded under pressure.