File-RsyBak
view release on metacpan or search on metacpan
script/rsybak view on Meta::CPAN
#
# die "'$obj' not an object" unless blessed($obj);
# die "Please specify action" unless $action0;
# die "Invalid action '$action0', please choose add|replace|add_or_replace|wrap|delete"
# unless $action0 =~ /\A(add|replace|add_or_replace|wrap|delete)\z/;
# if ($action0 eq 'delete') {
# die "code not needed for 'delete' action" if $code0;
# } else {
# die "Please specify code" unless $code0;
# }
#
# my $package = ref($obj);
# my $name = "$package\::$methname";
# my $action = defined(&$name) ? 'wrap' : 'add';
#
# my $code = sub {
# my $ctx = $action eq 'wrap' ? shift : undef;
# my $self = $_[0];
# no warnings 'numeric';
# if ($obj == $self) {
# if ($action0 eq 'add') {
# $code0->(@_);
# } elsif ($action0 eq 'replace') {
# $code0->(@_);
# } elsif ($action0 eq 'add_or_replace') {
# $code0->(@_);
# } elsif ($action0 eq 'wrap') {
# my $octx = {%$ctx};
# $code0->($octx, @_);
# } elsif ($action0 eq 'delete') {
# die "Undefined method '$methname' for object '$obj'";
# } else {
# die "BUG: Unknown action '$action0'";
# }
# } else {
# if ($action eq 'wrap') {
# return $ctx->{orig}->(@_);
# } else {
# die "Undefined method '$methname' for object '$obj'";
# }
# }
# };
#
# patch_package($package, $methname, $action, $code, @extra);
#}
#
#1;
#
#__END__
#
### Monkey/Patch/Action/Handle.pm ###
#package Monkey::Patch::Action::Handle;
#
#our $DATE = '2018-04-02';
#our $VERSION = '0.061';
#
#use 5.010;
#use strict;
#use warnings;
#
#use Scalar::Util qw(weaken);
#use Sub::Delete;
#
#my %stacks;
#
#sub __find_previous {
# my ($stack, $code) = @_;
# state $empty = sub {};
#
# for my $i (1..$#$stack) {
# if ($stack->[$i][1] == $code) {
# return $stack->[$i-1][2] // $stack->[$i-1][1];
# }
# }
# $empty;
#}
#
#sub new {
# my ($class, %args) = @_;
#
# my $type = $args{-type};
# delete $args{-type};
#
# my $code = $args{code};
#
# my $name = "$args{package}::$args{subname}";
# my $stack;
# if (!$stacks{$name}) {
# $stacks{$name} = [];
# push @{$stacks{$name}}, [sub => \&$name] if defined(&$name);
# }
# $stack = $stacks{$name};
#
# my $self = bless \%args, $class;
#
# no strict 'refs';
# no warnings 'redefine';
# if ($type eq 'sub') {
# push @$stack, [$type => $code];
# *$name = $code;
# } elsif ($type eq 'delete') {
# $code = sub {};
# $args{code} = $code;
# push @$stack, [$type, $code];
# delete_sub $name;
# } elsif ($type eq 'wrap') {
# weaken($self);
# my $wrapper = sub {
# my $ctx = {
# package => $self->{package},
# subname => $self->{subname},
# extra => $self->{extra},
# orig => __find_previous($stack, $self->{code}),
# };
# unshift @_, $ctx;
# goto &{$self->{code}};
# };
# push @$stack, [$type => $code => $wrapper];
# *$name = $wrapper;
# }
#
# $self;
#}
#
#sub DESTROY {
# my $self = shift;
#
# my $name = "$self->{package}::$self->{subname}";
# my $stack = $stacks{$name};
# my $code = $self->{code};
#
# for my $i (0..$#$stack) {
# if($stack->[$i][1] == $code) {
# if ($stack->[$i+1]) {
# if ($stack->[$i+1][0] eq 'wrap' &&
# ($i == 0 || $stack->[$i-1][0] eq 'delete')) {
# my $p = $self->{patcher};
# warn "Warning: unapplying patch to $name ".
# "(applied in $p->[1]:$p->[2]) before a wrapping patch";
# }
# }
#
# no strict 'refs';
# if ($i == @$stack-1) {
# if ($i) {
# no warnings 'redefine';
# if ($stack->[$i-1][0] eq 'delete') {
# delete_sub $name;
# } else {
# *$name = $stack->[$i-1][2] // $stack->[$i-1][1];
# }
# } else {
# delete_sub $name;
# }
# }
# splice @$stack, $i, 1;
# last;
# }
# }
#}
#
#1;
#
#__END__
#
### Nodejs/Util.pm ###
#package Nodejs::Util;
( run in 1.059 second using v1.01-cache-2.11-cpan-39bf76dae61 )