[libclass-tiny-perl] 13/22: add support for DEMOLISH
gregor herrmann
gregoa at debian.org
Sun May 31 14:03:04 UTC 2015
This is an automated email from the git hooks/post-receive script.
gregoa pushed a commit to annotated tag release-0.001
in repository libclass-tiny-perl.
commit 3bbb1e84844630a9a792978791c148ec906a9280
Author: David Golden <dagolden at cpan.org>
Date: Fri Aug 16 09:17:52 2013 -0400
add support for DEMOLISH
---
lib/Class/Tiny.pm | 18 ++++++++++++++++++
t/delta.t | 7 +++++++
t/echo.t | 9 +++++++++
t/lib/Delta.pm | 10 ++++++++++
t/lib/Echo.pm | 5 +++++
5 files changed, 49 insertions(+)
diff --git a/lib/Class/Tiny.pm b/lib/Class/Tiny.pm
index 9fd19ba..fe62245 100644
--- a/lib/Class/Tiny.pm
+++ b/lib/Class/Tiny.pm
@@ -69,6 +69,24 @@ sub new {
return $self;
}
+# Adapted from Moo
+sub DESTROY {
+ my $self = shift;
+
+ for my $s ( @{ mro::get_linear_isa( ref $self ) } ) {
+ no strict 'refs';
+ my $demolisher = *{ $s . "::DEMOLISH" }{CODE};
+ my $e = do {
+ local $?;
+ local $@;
+ eval { $self->$demolisher if defined $demolisher };
+ $@;
+ };
+ no warnings 'misc'; # avoid (in cleanup) warnings
+ die $e if $e; # rethrow
+ }
+}
+
1;
=for Pod::Coverage method_names_here
diff --git a/t/delta.t b/t/delta.t
index 26c75d8..fc05cc9 100644
--- a/t/delta.t
+++ b/t/delta.t
@@ -16,6 +16,13 @@ subtest "attribute set as list" => sub {
is( $obj->bar, 23, "bar is set" );
};
+subtest "destructor" => sub {
+ my @objs = map { new_ok( "Delta", [ foo => 42, bar => 23 ] ) } 1 .. 3;
+ is ($Delta::counter, 3, "BUILD incremented counter");
+ @objs = ();
+ is ($Delta::counter, 0, "DEMOLISH decremented counter");
+};
+
subtest "exceptions" => sub {
like(
exception { Delta->new( foo => 0 ) },
diff --git a/t/echo.t b/t/echo.t
index d95169e..f6a903e 100644
--- a/t/echo.t
+++ b/t/echo.t
@@ -17,6 +17,15 @@ subtest "attribute set as list" => sub {
is( $obj->baz, 24, "baz is set" );
};
+subtest "destructor" => sub {
+ no warnings 'once';
+ my @objs = map { new_ok( "Echo", [ foo => 42, bar => 23 ] ) } 1 .. 3;
+ is ($Delta::counter, 3, "BUILD incremented counter");
+ @objs = ();
+ is ($Delta::counter, 0, "DEMOLISH decremented counter");
+ is ($Delta::exception, 0, "cleanup worked in correct order");
+};
+
subtest "exceptions" => sub {
like(
exception { Echo->new( foo => 0, bar => 23 ) },
diff --git a/t/lib/Delta.pm b/t/lib/Delta.pm
index 670c308..bde1cd5 100644
--- a/t/lib/Delta.pm
+++ b/t/lib/Delta.pm
@@ -4,6 +4,9 @@ use warnings;
package Delta;
+our $counter = 0;
+our $exception = 0;
+
use Carp ();
use Class::Tiny qw/foo bar/;
@@ -14,6 +17,13 @@ sub BUILD {
unless defined $self->foo && $self->foo > 0;
$self->bar(42) unless defined $self->bar;
+ $counter++;
+}
+
+sub DEMOLISH {
+ my $self = shift;
+ $counter--;
+ $exception++ if keys %$self > 2; # Echo will delete first
}
1;
diff --git a/t/lib/Echo.pm b/t/lib/Echo.pm
index 36d6727..5b3c793 100644
--- a/t/lib/Echo.pm
+++ b/t/lib/Echo.pm
@@ -12,4 +12,9 @@ sub BUILD {
$self->baz( $self->bar + 1 );
}
+sub DEMOLISH {
+ my $self = shift;
+ delete $self->{baz}; # or else Delta::DEMOLISH dies
+}
+
1;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libclass-tiny-perl.git
More information about the Pkg-perl-cvs-commits
mailing list