Tenative switch to a generated DEMOLISHALL - see rest of message for caveats
[gitmo/Role-Tiny.git] / lib / Moo / Object.pm
index f62bc35..06a86f9 100644 (file)
@@ -4,6 +4,7 @@ use strictures 1;
 
 our %NO_BUILD;
 our $BUILD_MAKER;
+our $DEMOLISH_MAKER;
 
 sub new {
   my $class = shift;
@@ -18,6 +19,25 @@ sub new {
       };
 }
 
+# Inlined into Method::Generate::Constructor::_generate_args() - keep in sync
+sub BUILDARGS {
+    my $class = shift;
+    if ( scalar @_ == 1 ) {
+        unless ( defined $_[0] && ref $_[0] eq 'HASH' ) {
+            die "Single parameters to new() must be a HASH ref"
+                ." data => ". $_[0] ."\n";
+        }
+        return { %{ $_[0] } };
+    }
+    elsif ( @_ % 2 ) {
+        die "The new() method for $class expects a hash reference or a key/value list."
+                . " You passed an odd number of arguments\n";
+    }
+    else {
+        return {@_};
+    }
+}
+
 sub BUILDALL {
   my $self = shift;
   $self->${\(($BUILD_MAKER ||= do {
@@ -26,6 +46,36 @@ sub BUILDALL {
   })->generate_method(ref($self)))}(@_);
 }
 
+sub DESTROY {
+    my $self = shift;
+
+    return unless $self->can('DEMOLISH'); # short circuit
+
+    require Moo::_Utils;
+
+    my $e = do {
+        local $?;
+        local $@;
+        eval {
+            # DEMOLISHALL
+
+            $self->DEMOLISHALL($Moo::_Utils::_in_global_destruction);
+        };
+        $@;
+    };
+
+    no warnings 'misc';
+    die $e if $e; # rethrow
+}
+
+sub DEMOLISHALL {
+  my $self = shift;
+  $self->${\(($DEMOLISH_MAKER ||= do {
+    require Method::Generate::DemolishAll;
+    Method::Generate::DemolishAll->new
+  })->generate_method(ref($self)))}(@_);
+}
+
 sub does {
   require Role::Tiny;
   { no warnings 'redefine'; *does = \&Role::Tiny::does_role }