use strict;
use warnings;
-use Test::More tests => 73;
+use Test::More tests => 84;
use Test::Exception;
-BEGIN {
- use_ok('Class::MOP');
-}
+use Class::MOP;
{
package Foo;
}
{
+ my $meta = Foo->meta;
+
+ my $transformer;
+ lives_ok{ $transformer = $meta->create_immutable_transformer }
+ "Created immutable transformer";
+ isa_ok($transformer, 'Class::MOP::Immutable', '... transformer isa Class::MOP::Immutable');
+ my $methods = $transformer->create_methods_for_immutable_metaclass;
+
+ my $immutable_metaclass = $transformer->immutable_metaclass;
+ is($transformer->metaclass, $meta, '... transformer has correct metaclass');
+ ok($immutable_metaclass->is_anon_class, '... immutable_metaclass is an anonymous class');
+
+ #I don't understand why i need to ->meta here...
+ my $obj = $immutable_metaclass->name;
+ ok(!$obj->is_mutable, '... immutable_metaclass is not mutable');
+ ok($obj->is_immutable, '... immutable_metaclass is immutable');
+ ok(!$obj->make_immutable, '... immutable_metaclass make_mutable is noop');
+ is($obj->meta, $immutable_metaclass, '... immutable_metaclass meta hack works');
+
+ is_deeply(
+ [ $immutable_metaclass->superclasses ],
+ [ Scalar::Util::blessed($meta) ],
+ '... immutable_metaclass superclasses are correct'
+ );
+ ok($immutable_metaclass->has_method('get_mutable_metaclass_name'));
+
+}
+
+{
my $meta = Foo->meta;
is($meta->name, 'Foo', '... checking the Foo metaclass');
ok($meta->is_mutable, '... our class is mutable');
ok(!$meta->is_immutable, '... our class is not immutable');
+ my $transformer = $meta->get_immutable_transformer;
+
lives_ok {
$meta->make_immutable();
} '... changed Foo to be immutable';
+ is($transformer, $meta->get_immutable_transformer, '... immutable transformer cache works');
ok(!$meta->make_immutable, '... make immutable now returns nothing');
ok(!$meta->is_mutable, '... our class is no longer mutable');
dies_ok { $meta->add_package_symbol() } '... exception thrown as expected';
dies_ok { $meta->remove_package_symbol() } '... exception thrown as expected';
+ lives_ok { $meta->identifier() } '... no exception for get_package_symbol special case';
+
my @supers;
lives_ok {
@supers = $meta->superclasses;