すいませんが、質問です。
package foo;
sub new {
  my ($class, %conf) = @_;
  my $self = bless {}, $class;
  $self->{hoge_func} = \&hoge_func;
  $self->{piyo_func} = \&piyo_func;
  return $self;
}
sub call_function {
  my ($self, $func_name, $argv) = @_;
  return $self->{$func_name}($argv);
}
sub hoge_func { #いろいろ }
sub piyo_func { #いろいろ }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
呼出側で
$obj->call_function('hoge_func', $argv);
とすると、 hoge_func, piyo_func ともに $_[0] に $argv がきてしまいます。
$_[0] には、オブジェクトのリファレンスが入ってるものだと思ってたのですが、
そうする為には sub call_function{} の return のとこを

return $self->{$func_name}($self, $argv);

にしないと オブジェクトのリファレンスが渡されません。
何故でしょうか?

また、こういう事をしたい場合の王道的な方法というのがあったら教えてください。
実際には hoge_func, piyo_func 的な関数が 数十から百くらいになる予定なので
統一的な呼び出し方にしたいのです。