17 ok(!$meta->is_overloaded);
19 is_deeply([sort $meta->overload_operators],
20 [sort map { split /\s+/ } values %overload::ops]);
22 ok(!$meta->has_overloaded_operator('+'));
23 ok(!$meta->has_overloaded_operator('-'));
25 is_deeply([$meta->get_overload_list], []);
27 is_deeply([$meta->get_all_overloaded_operators], []);
29 is($meta->get_overloaded_operator('+'), undef);
30 is($meta->get_overloaded_operator('-'), undef);
35 BEGIN { $plus_impl = sub { $plus = 1; "plus" } }
37 package Foo::Overloaded;
39 use overload '+' => $plus_impl;
43 my $meta = Foo::Overloaded->meta;
45 ok($meta->is_overloaded);
47 ok($meta->has_overloaded_operator('+'));
48 ok(!$meta->has_overloaded_operator('-'));
50 is_deeply([$meta->get_overload_list], ['+']);
52 my @overloads = $meta->get_all_overloaded_operators;
53 is(scalar(@overloads), 1);
54 my $plus_meth = $overloads[0];
55 isa_ok($plus_meth, 'Class::MOP::Method::Overload');
56 is($plus_meth->operator, '+');
57 is($plus_meth->name, '(+');
58 is($plus_meth->body, $plus_impl);
59 is($plus_meth->package_name, 'Foo::Overloaded');
60 is($plus_meth->associated_metaclass, $meta);
62 my $plus_meth2 = $meta->get_overloaded_operator('+');
63 { local $TODO = "we don't cache these yet";
64 is($plus_meth2, $plus_meth);
66 is($plus_meth2->operator, '+');
67 is($plus_meth2->body, $plus_impl);
68 is($meta->get_overloaded_operator('-'), undef);
71 is(Foo::Overloaded->new + Foo::Overloaded->new, "plus");
75 my $minus_impl = sub { $minus = 1; "minus" };
77 like(exception { Foo::Overloaded->new - Foo::Overloaded->new },
78 qr/Operation $quote-$quote: no method found/);
80 $meta->add_overloaded_operator('-' => $minus_impl);
82 ok($meta->has_overloaded_operator('-'));
84 is_deeply([sort $meta->get_overload_list], ['+', '-']);
86 is(scalar($meta->get_all_overloaded_operators), 2);
88 my $minus_meth = $meta->get_overloaded_operator('-');
89 isa_ok($minus_meth, 'Class::MOP::Method::Overload');
90 is($minus_meth->operator, '-');
91 is($minus_meth->name, '(-');
92 is($minus_meth->body, $minus_impl);
93 is($minus_meth->package_name, 'Foo::Overloaded');
94 is($minus_meth->associated_metaclass, $meta);
97 is(Foo::Overloaded->new - Foo::Overloaded->new, "minus");
100 $meta->remove_overloaded_operator('-');
102 like(exception { Foo::Overloaded->new - Foo::Overloaded->new },
103 qr/Operation $quote-$quote: no method found/);
109 package Foo::OverloadedMethod;
111 use overload '*' => 'times';
113 sub times { $times = 1; "times" }
114 sub divided { $divided = 1; "divided" }
118 my $meta = Foo::OverloadedMethod->meta;
120 ok($meta->is_overloaded);
122 ok($meta->has_overloaded_operator('*'));
123 ok(!$meta->has_overloaded_operator('/'));
125 is_deeply([$meta->get_overload_list], ['*']);
127 my @overloads = $meta->get_all_overloaded_operators;
128 is(scalar(@overloads), 1);
129 my $times_meth = $overloads[0];
130 isa_ok($times_meth, 'Class::MOP::Method::Overload');
131 is($times_meth->operator, '*');
132 is($times_meth->name, '(*');
133 is($times_meth->body, $meta->get_method('times')->body);
134 is($times_meth->package_name, 'Foo::OverloadedMethod');
135 is($times_meth->associated_metaclass, $meta);
137 my $times_meth2 = $meta->get_overloaded_operator('*');
138 { local $TODO = "we don't cache these yet";
139 is($times_meth2, $times_meth);
141 is($times_meth2->operator, '*');
142 is($times_meth2->body, $meta->get_method('times')->body);
143 is($meta->get_overloaded_operator('/'), undef);
146 is(Foo::OverloadedMethod->new * Foo::OverloadedMethod->new, "times");
149 like(exception { Foo::OverloadedMethod->new / Foo::OverloadedMethod->new },
150 qr{Operation $quote/$quote: no method found});
152 $meta->add_overloaded_operator('/' => 'divided');
154 ok($meta->has_overloaded_operator('/'));
156 is_deeply([sort $meta->get_overload_list], ['*', '/']);
158 is(scalar($meta->get_all_overloaded_operators), 2);
160 my $divided_meth = $meta->get_overloaded_operator('/');
161 isa_ok($divided_meth, 'Class::MOP::Method::Overload');
162 is($divided_meth->operator, '/');
163 is($divided_meth->name, '(/');
164 is($divided_meth->body, $meta->get_method('divided')->body);
165 is($divided_meth->package_name, 'Foo::OverloadedMethod');
166 is($divided_meth->associated_metaclass, $meta);
169 is(Foo::OverloadedMethod->new / Foo::OverloadedMethod->new, "divided");
172 $meta->remove_overloaded_operator('/');
174 like(exception { Foo::OverloadedMethod->new / Foo::OverloadedMethod->new },
175 qr{Operation $quote/$quote: no method found});