finish get_attribute_values etc
[gitmo/Class-MOP.git] / t / 046-rebless.t
CommitLineData
3d9e4646 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
9b71b643 6use Test::More tests => 27;
3d9e4646 7use Test::Exception;
8use Scalar::Util 'blessed';
9
10{
11 package Parent;
12 use metaclass;
13
14 sub new { bless {} => shift }
15 sub whoami { "parent" }
16 sub parent { "parent" }
17
18 package Child;
19 use metaclass;
20 use base qw/Parent/;
21
22 sub whoami { "child" }
23 sub child { "child" }
24
25 package LeftField;
26 use metaclass;
27
28 sub new { bless {} => shift }
29 sub whoami { "leftfield" }
30 sub myhax { "areleet" }
31}
32
33# basic tests
34my $foo = Parent->new;
35is(blessed($foo), 'Parent', 'Parent->new gives a Parent');
36is($foo->whoami, "parent", 'Parent->whoami gives parent');
37is($foo->parent, "parent", 'Parent->parent gives parent');
38dies_ok { $foo->child } "Parent->child method doesn't exist";
39
3cd40f5e 40Child->meta->rebless_instance($foo);
3d9e4646 41is(blessed($foo), 'Child', 'rebless_instance really reblessed the instance');
42is($foo->whoami, "child", 'reblessed->whoami gives child');
43is($foo->parent, "parent", 'reblessed->parent gives parent');
44is($foo->child, "child", 'reblessed->child gives child');
45
3cd40f5e 46throws_ok { LeftField->meta->rebless_instance($foo, "LeftField") }
de0d4f93 47 qr/You may rebless only into a subclass of \(Child\), of which \(LeftField\) isn't\./;
3cd40f5e 48
49throws_ok { Class::MOP::Class->initialize("NonExistent")->rebless_instance($foo) }
de0d4f93 50 qr/You may rebless only into a subclass of \(Child\), of which \(NonExistent\) isn't\./;
3d9e4646 51
52# make sure our ->meta is still sane
53my $bar = Parent->new;
54is(blessed($bar), 'Parent', "sanity check");
55is(blessed($bar->meta), 'Class::MOP::Class', "meta gives a Class::MOP::Class");
56is($bar->meta->name, 'Parent', "this Class::MOP::Class instance is for Parent");
57
58ok($bar->meta->has_method('new'), 'metaclass has "new" method');
59ok($bar->meta->has_method('whoami'), 'metaclass has "whoami" method');
60ok($bar->meta->has_method('parent'), 'metaclass has "parent" method');
61
62is(blessed($bar->meta->new_object), 'Parent', 'new_object gives a Parent');
63
3cd40f5e 64Child->meta->rebless_instance($bar);
3d9e4646 65is(blessed($bar), 'Child', "rebless really reblessed");
66is(blessed($bar->meta), 'Class::MOP::Class', "meta gives a Class::MOP::Class");
67is($bar->meta->name, 'Child', "this Class::MOP::Class instance is for Child");
68
69ok($bar->meta->find_method_by_name('new'), 'metaclass has "new" method');
70ok($bar->meta->find_method_by_name('parent'), 'metaclass has "parent" method');
71ok(!$bar->meta->has_method('new'), 'no "new" method in this class');
72ok(!$bar->meta->has_method('parent'), 'no "parent" method in this class');
73ok($bar->meta->has_method('whoami'), 'metaclass has "whoami" method');
74ok($bar->meta->has_method('child'), 'metaclass has "child" method');
75
76is(blessed($bar->meta->new_object), 'Child', 'new_object gives a Child');
77