this, sort of, works
[gitmo/MooseX-Antlers.git] / lib / MooseX / Antlers / EvalTracker.pm
index 8466698..d56a5aa 100644 (file)
@@ -2,11 +2,14 @@ package MooseX::Antlers::EvalTracker;
 
 use Moose;
 use MooseX::Antlers::ErrorThrower;
+use aliased 'MooseX::Antlers::RefFilter';
 use Scalar::Util qw(weaken refaddr);
 use PadWalker qw(closed_over);
 use Sub::Identify qw(sub_fullname);
 use B qw(perlstring);
 use namespace::clean -except => 'meta';
+use String::TT qw(tt strip);
+use Data::Dumper::Concise;
 
 has '_original_eval_closure' => (is => 'ro', lazy_build => 1);
 has '_our_eval_closure' => (is => 'ro', lazy_build => 1);
@@ -71,6 +74,36 @@ sub _eval_closure_called_for {
   #warn Dumper($body);
 }
 
+sub serialized_construction {
+  my ($self, $externals) = @_;
+  my $code = strip q{
+    package Class::MOP::Method::Generated;
+    use strict;
+    use warnings;
+  };
+  foreach my $recorded (@{$self->recorded_coderefs}) {
+    my ($cr, $captures, $body) = @{$recorded};
+    my $name = sub_fullname($cr);
+    my $name_string = perlstring($name);
+    my $filter = RefFilter->new(
+      external_mappings => $externals,
+      root_name => '$__captures'
+    );
+    my $filtered_captures = Dumper($filter->visit($captures));
+    my $fixup_code = $filter->fixup_code;
+    my $use_captures = $self->_generate_capture_constructor($captures);
+    $code .= strip tt q{
+      {
+        my $__captures = [% filtered_captures %];
+        [% fixup_code %]
+        [% use_captures %]
+        *[% name %] = Sub::Name::subname [% name_string %] => [% body %];
+      }
+    };
+  }
+  return $code;
+}
+    
 sub _generate_coderef_constructor {
   my ($self, $entry) = @_;
   my ($cr, $captures, $body) = @{$entry};