move to early generation of DESTROY/DEMOLISHALL where possible and hope like hell...
[gitmo/Role-Tiny.git] / lib / Moo / Object.pm
index 09a4541..04d7f7e 100644 (file)
@@ -3,10 +3,20 @@ package Moo::Object;
 use strictures 1;
 
 our %NO_BUILD;
+our %NO_DEMOLISH;
 our $BUILD_MAKER;
+our $DEMOLISH_MAKER;
 
 sub new {
   my $class = shift;
+  unless (exists $NO_DEMOLISH{$class}) {
+    unless ($NO_DEMOLISH{$class} = !$class->can('DEMOLISH')) {
+      ($DEMOLISH_MAKER ||= do {
+        { local $@; require Method::Generate::DemolishAll; }
+        Method::Generate::DemolishAll->new
+      })->generate_method($class);
+    }
+  }
   $NO_BUILD{$class} and
     return bless({ ref($_[0]) eq 'HASH' ? %{$_[0]} : @_ }, $class);
   $NO_BUILD{$class} = !$class->can('BUILD') unless exists $NO_BUILD{$class};
@@ -18,6 +28,7 @@ sub new {
       };
 }
 
+# Inlined into Method::Generate::Constructor::_generate_args() - keep in sync
 sub BUILDARGS {
     my $class = shift;
     if ( scalar @_ == 1 ) {
@@ -39,13 +50,21 @@ sub BUILDARGS {
 sub BUILDALL {
   my $self = shift;
   $self->${\(($BUILD_MAKER ||= do {
-    require Method::Generate::BuildAll;
+    { local $@; require Method::Generate::BuildAll; }
     Method::Generate::BuildAll->new
   })->generate_method(ref($self)))}(@_);
 }
 
+sub DEMOLISHALL {
+  my $self = shift;
+  $self->${\(($DEMOLISH_MAKER ||= do {
+    { local $@; require Method::Generate::DemolishAll; }
+    Method::Generate::DemolishAll->new
+  })->generate_method(ref($self)))}(@_);
+}
+
 sub does {
-  require Role::Tiny;
+  { local $@; require Role::Tiny; }
   { no warnings 'redefine'; *does = \&Role::Tiny::does_role }
   goto &Role::Tiny::does_role;
 }