use strict;
use warnings FATAL => 'all';
-use aliased 'MooseX::Antlers::EvalTracker';
-use aliased 'MooseX::Antlers::RefTracker';
-use aliased 'MooseX::Antlers::RefFilter';
-use B qw(perlstring);
+use MooseX::Antlers::Compiler;
use lib 't/lib';
use Test::More;
+use Test::Exception;
+use Class::Unload;
-my %attr_refs;
-my %attr_methods;
-
-{
- require Moose;
- my $orig = Moose->can('import');
- no warnings 'redefine';
- local *Moose::import = sub {
- my $targ = caller;
- Moose->$orig({ into => $targ });
- my $has = $targ->can('has');
- {
- no strict 'refs';
- *{"${targ}::has"} = sub {
- $attr_refs{$_[0]} = RefTracker->trace_refs(
- '$attributes{'.perlstring($_[0]).'}'
- => \@_
- );
- my $et = EvalTracker->new->enable;
- $has->(@_);
- $attr_methods{$_[0]} = $et->recorded_coderefs;
- };
- }
- };
- require One;
+my $compiler = MooseX::Antlers::Compiler->load_with_compiler('One');
+
+sub foo_called {
+ &cmp_ok(One->get_called_foo, '==', @_); # cmp_ok has a $$$;$ proto
+}
+
+sub test_One {
+
+ ok(One->can('foo'), 'foo accessor installed');
+
+ dies_ok { One->new } 'foo is required';
+
+ foo_called(0 => 'trigger not called yet');
+
+ my $one = One->new(foo => 1);
+
+ foo_called(1 => 'trigger called once (constructor)');
+
+ cmp_ok($one->foo, '==', 1, 'read ok');
+
+ foo_called(1 => 'trigger not called for read');
+
+ $one->foo(2);
+
+ foo_called(2 => 'trigger called for setter');
}
-ok(One->can('foo'), 'foo accessor installed');
+my %orig_src = map +($_ => join '', Dump(One->can($_))), qw(new DESTROY one);
+
+my $orig_foo_meta = Dump(One->meta);
+
+test_One();
use Data::Dump::Streamer;
-my $orig_foo_src = Dump(One->can('foo'));
+my $compiled = $compiler->compiled_source;
+
+#warn $compiled; done_testing; exit 0;
+
+Class::Unload->unload('One');
+Class::MOP::remove_metaclass_by_name('One');
+
+eval $compiled; die "Shit. failed.\n\n${compiled}\n\nError: $@" if $@;
+
+use Data::Dumper::Concise;
+
+my %compiled_src = map +($_ => join '', Dump(One->can($_))), qw(new DESTROY one);
+
+#foreach my $method (qw(new DESTROY one)) {
+# is($compiled_src{$method}, $orig_src{$method}, "${method} restored ok");
+#}
+
+test_One;
# write test_class method that checks method including call
# Class::Unload One
# eval compiled source
# run test_class after that as well as before unload
-use Data::Dumper::Concise;
-
#warn Dumper \%attr_refs;
-#warn Dumper \%attr_methods;
+#warn Dumper \%attr_et;
+#warn Dumper $im_et;
done_testing;