use Test::More;
use Test::Exception;
use Class::Unload;
+use IO::All;
+use Data::Dumper::Concise;
+use Data::Dump::Streamer;
-my $compiler = MooseX::Antlers::Compiler->load_with_compiler('One');
+sub dump_meta {
+ my $meta = $_[0];
+ local $meta->{methods}{meta};
+ join '', Dump($meta);
+}
sub foo_called {
- &cmp_ok(One->get_called_foo, '==', @_); # cmp_ok has a $$$;$ proto
+ &cmp_ok(shift->get_called_foo, '==', @_); # cmp_ok has a $$$;$ proto
}
sub test_One {
+ my $class = shift;
- ok(One->can('foo'), 'foo accessor installed');
+ ok($class->can('foo'), $class . ' foo accessor installed');
- dies_ok { One->new } 'foo is required';
+ dies_ok { $class->new } $class . ' foo is required';
- foo_called(0 => 'trigger not called yet');
+ foo_called($class, 0 => $class . ' trigger not called yet');
- my $one = One->new(foo => 1);
+ my $i = $class->new(foo => 1);
- foo_called(1 => 'trigger called once (constructor)');
+ foo_called($class, 1 => $class . ' trigger called once (constructor)');
- cmp_ok($one->foo, '==', 1, 'read ok');
+ cmp_ok($i->foo, '==', 1, $class . ' read ok');
- foo_called(1 => 'trigger not called for read');
+ foo_called($class, 1 => $class . ' trigger not called for read');
- $one->foo(2);
+ $i->foo(2);
- foo_called(2 => 'trigger called for setter');
+ foo_called($class, 2 => $class . ' trigger called for setter');
}
-my %orig_src = map +($_ => join '', Dump(One->can($_))), qw(new DESTROY one);
+test_class('One', \&test_One);
+test_class('Two', \&test_One);
+test_class('Three', \&test_One);
-my $orig_foo_meta = Dump(One->meta);
+sub test_class {
+ my ($class, $test) = @_;
-test_One();
+ my $compiler = MooseX::Antlers::Compiler->load_with_compiler($class);
-use Data::Dump::Streamer;
+ # FIXME - foo
+ my %orig_src = map +($_ => join '', Dump($class->can($_))), qw(new DESTROY foo);
-my $compiled = $compiler->compiled_source;
+ $class->meta->get_method_list; # fill cache
-#warn $compiled; done_testing; exit 0;
+ my $orig_meta = dump_meta $class->meta;
-Class::Unload->unload('One');
-Class::MOP::remove_metaclass_by_name('One');
+ $test->($class);
-eval $compiled; die "Shit. failed.\n\n${compiled}\n\nError: $@" if $@;
+ my $compiled = $compiler->compiled_source;
-use Data::Dumper::Concise;
+ #warn $compiled; done_testing; exit 0;
+
+ Class::Unload->unload($class);
+ Class::MOP::remove_metaclass_by_name($class);
+
+ io("/tmp/$class.pmc")->print($compiled);
-my %compiled_src = map +($_ => join '', Dump(One->can($_))), qw(new DESTROY one);
+ require "/tmp/$class.pmc";
-#foreach my $method (qw(new DESTROY one)) {
-# is($compiled_src{$method}, $orig_src{$method}, "${method} restored ok");
-#}
+ #eval "no warnings; $compiled";
-test_One;
+ #die "Shit. failed.\n\n${compiled}\n\nError: $@" if $@;
-# write test_class method that checks method including call
-# Class::Unload One
-# build compiled source
-# eval compiled source
-# run test_class after that as well as before unload
+ my %compiled_src = map +($_ => join '', Dump($class->can($_))), qw(new DESTROY foo);
-#warn Dumper \%attr_refs;
-#warn Dumper \%attr_et;
-#warn Dumper $im_et;
+ # FIXME - foo
+ foreach my $method (qw(new DESTROY foo)) {
+ is($compiled_src{$method}, $orig_src{$method}, "${method} restored ok");
+ }
+
+ my $compiled_meta = dump_meta $class->meta;
+
+ $test->($class);
+
+ #io('orig')->print($orig_meta);
+ #io('comp')->print($compiled_meta);
+
+ is($orig_meta, $compiled_meta, $class . ' metaclass restored ok');
+
+ Class::Unload->unload($class);
+ Class::MOP::remove_metaclass_by_name($class);
+}
done_testing;