我正在尝试对LWP::UserAgent实例进行猴子补丁(duck-punch :-),如下所示:

sub _user_agent_get_basic_credentials_patch {
  return ($username, $password);
}

my $agent = LWP::UserAgent->new();
$agent->get_basic_credentials = _user_agent_get_basic_credentials_patch;

这不是正确的语法-它产生:



我从Programming Perl回忆起,调度查找是基于受祝福的程序包(我相信ref($agent))动态执行的,因此我不确定实例猴子补丁在不影响受祝福的程序包的情况下如何工作。

我知道我可以继承UserAgent,但是我更喜欢更简洁的猴子修补方法。同意成年人,你有什么。 ;-)

最佳答案

如果动态范围(使用local)不令人满意,则可以自动执行自定义程序包重整技术:

MONKEY_PATCH_INSTANCE:
{
  my $counter = 1; # could use a state var in perl 5.10

  sub monkey_patch_instance
  {
    my($instance, $method, $code) = @_;
    my $package = ref($instance) . '::MonkeyPatch' . $counter++;
    no strict 'refs';
    @{$package . '::ISA'} = (ref($instance));
    *{$package . '::' . $method} = $code;
    bless $_[0], $package; # sneaky re-bless of aliased argument
  }
}

用法示例:
package Dog;
sub new { bless {}, shift }
sub speak { print "woof!\n" }

...

package main;

my $dog1 = Dog->new;
my $dog2 = Dog->new;

monkey_patch_instance($dog2, speak => sub { print "yap!\n" });

$dog1->speak; # woof!
$dog2->speak; # yap!

关于perl - 如何在Perl中猴子修补实例方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/449690/

10-12 01:33