Tenative switch to a generated DEMOLISHALL - see rest of message for caveats
[gitmo/Moo.git] / lib / Method / Generate / DemolishAll.pm
diff --git a/lib/Method/Generate/DemolishAll.pm b/lib/Method/Generate/DemolishAll.pm
new file mode 100644 (file)
index 0000000..0126680
--- /dev/null
@@ -0,0 +1,34 @@
+package Method::Generate::DemolishAll;
+
+use strictures 1;
+use base qw(Moo::Object);
+use Sub::Quote;
+use Moo::_Utils;
+use B qw(perlstring);
+
+sub generate_method {
+  my ($self, $into) = @_;
+  quote_sub "${into}::DEMOLISHALL", join '',
+    $self->_handle_subdemolish($into),
+    qq{    my \$self = shift;\n},
+    $self->demolishall_body_for($into, '$self', '@_'),
+    qq{    return \$self\n};
+}
+
+sub demolishall_body_for {
+  my ($self, $into, $me, $args) = @_;
+  my @demolishers =
+    grep *{_getglob($_)}{CODE},
+    map "${_}::DEMOLISH",
+    @{Moo::_Utils::_get_linear_isa($into)};
+  join '', map qq{    ${me}->${_}(${args});\n}, @demolishers;
+}
+
+sub _handle_subdemolish {
+  my ($self, $into) = @_;
+  '    if (ref($_[0]) ne '.perlstring($into).') {'."\n".
+  '      return shift->Moo::Object::DEMOLISHALL(@_)'.";\n".
+  '    }'."\n";
+}
+
+1;