How can I monkey-patch an instance method in Perl?

前端 未结 8 2295
醉酒成梦
醉酒成梦 2020-12-08 01:25

I\'m trying to monkey-patch (duck-punch :-) a LWP::UserAgent instance, like so:

sub _user_agent_get_basic_credentials_patch {
  return ($usernam         


        
8条回答
  •  眼角桃花
    2020-12-08 01:49

    If dynamic scope (using local) isn't satisfactory, you can automate the custom package reblessing technique:

    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
      }
    }
    

    Example usage:

    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!
    

提交回复
热议问题