lib/PublicInbox/NNTPD.pm
lib/PublicInbox/NNTPdeflate.pm
lib/PublicInbox/NewsWWW.pm
+lib/PublicInbox/OnDestroy.pm
lib/PublicInbox/Over.pm
lib/PublicInbox/OverIdx.pm
lib/PublicInbox/ProcessPipe.pm
t/nntpd.t
t/nodatacow.t
t/nulsubject.t
+t/on_destroy.t
t/over.t
t/plack-2-txt-bodies.eml
t/plack-attached-patch.eml
--- /dev/null
+# Copyright (C) 2020 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+
+package PublicInbox::OnDestroy;
+
+sub new {
+ shift; # ($class, $cb, @args)
+ bless [ @_ ], __PACKAGE__;
+}
+
+sub DESTROY {
+ my ($cb, @args) = @{$_[0]};
+ $cb->(@args) if $cb;
+}
+
+1;
--- /dev/null
+#!perl -w
+use strict;
+use v5.10.1;
+use Test::More;
+require_ok 'PublicInbox::OnDestroy';
+my @x;
+my $od = PublicInbox::OnDestroy->new(sub { push @x, 'hi' });
+is_deeply(\@x, [], 'not called, yet');
+undef $od;
+is_deeply(\@x, [ 'hi' ], 'no args works');
+$od = PublicInbox::OnDestroy->new(sub { $x[0] = $_[0] }, 'bye');
+is_deeply(\@x, [ 'hi' ], 'nothing changed while alive');
+undef $od;
+is_deeply(\@x, [ 'bye' ], 'arg passed');
+$od = PublicInbox::OnDestroy->new(sub { @x = @_ }, qw(x y));
+undef $od;
+is_deeply(\@x, [ 'x', 'y' ], '2 args passed');
+
+if (my $nr = $ENV{TEST_LEAK_NR}) {
+ for (0..$nr) {
+ $od = PublicInbox::OnDestroy->new(sub { @x = @_ }, qw(x y));
+ }
+}
+
+done_testing;