actually, why not make the meta method renameable
[gitmo/Class-MOP.git] / t / 049_metaclass_reinitialize.t
index 6861b04..7d8dd50 100644 (file)
@@ -97,16 +97,16 @@ is(Bar->meta->get_attribute('bar')->tset, 'OOF');
 
 {
     package Baz;
-    use metaclass;
+    use metaclass meta_name => undef;
 
     sub foo {}
-    Baz->meta->add_attribute('bar');
+    Class::MOP::class_of('Baz')->add_attribute('bar');
 }
 
-$meta = Baz->meta;
+$meta = Class::MOP::class_of('Baz');
 check_meta_sanity($meta, 'Baz');
-ok(!Baz->meta->get_method('foo')->isa('Baz::Meta::Method'));
-ok(!Baz->meta->get_attribute('bar')->isa('Baz::Meta::Attribute'));
+ok(!$meta->get_method('foo')->isa('Baz::Meta::Method'));
+ok(!$meta->get_attribute('bar')->isa('Baz::Meta::Attribute'));
 lives_ok {
     $meta = $meta->reinitialize(
         'Baz',
@@ -115,8 +115,8 @@ lives_ok {
     );
 };
 check_meta_sanity($meta, 'Baz');
-isa_ok(Baz->meta->get_method('foo'), 'Baz::Meta::Method');
-isa_ok(Baz->meta->get_attribute('bar'), 'Baz::Meta::Attribute');
+isa_ok($meta->get_method('foo'), 'Baz::Meta::Method');
+isa_ok($meta->get_attribute('bar'), 'Baz::Meta::Attribute');
 
 {
     package Quux;
@@ -140,4 +140,66 @@ throws_ok {
     );
 } qr/compatible/;
 
+{
+    package Quuux::Meta::Attribute;
+    use base 'Class::MOP::Attribute';
+
+    sub install_accessors {}
+}
+
+{
+    package Quuux;
+    use metaclass;
+    sub foo {}
+    Quuux->meta->add_attribute('bar', reader => 'bar');
+}
+
+$meta = Quuux->meta;
+check_meta_sanity($meta, 'Quuux');
+ok($meta->has_method('bar'));
+lives_ok {
+    $meta = $meta->reinitialize(
+        'Quuux',
+        attribute_metaclass => 'Quuux::Meta::Attribute',
+    );
+};
+check_meta_sanity($meta, 'Quuux');
+ok(!$meta->has_method('bar'));
+
+{
+    package Blah::Meta::Method;
+    use base 'Class::MOP::Method';
+
+    __PACKAGE__->meta->add_attribute('foo', reader => 'foo', default => 'TEST');
+}
+
+{
+    package Blah::Meta::Attribute;
+    use base 'Class::MOP::Attribute';
+
+    __PACKAGE__->meta->add_attribute('oof', reader => 'oof', default => 'TSET');
+}
+
+{
+    package Blah;
+    use metaclass no_meta => 1;
+    sub foo {}
+    Class::MOP::class_of('Blah')->add_attribute('bar');
+}
+
+$meta = Class::MOP::class_of('Blah');
+check_meta_sanity($meta, 'Blah');
+lives_ok {
+    $meta = Class::MOP::Class->reinitialize(
+        'Blah',
+        attribute_metaclass => 'Blah::Meta::Attribute',
+        method_metaclass    => 'Blah::Meta::Method',
+    );
+};
+check_meta_sanity($meta, 'Blah');
+can_ok($meta->get_method('foo'), 'foo');
+is($meta->get_method('foo')->foo, 'TEST');
+can_ok($meta->get_attribute('bar'), 'oof');
+is($meta->get_attribute('bar')->oof, 'TSET');
+
 done_testing;