15 ok(!$meta->is_overloaded);
17 is_deeply([sort $meta->overload_operators],
18 [sort map { split /\s+/ } values %overload::ops]);
20 ok(!$meta->has_overloaded_operator('+'));
21 ok(!$meta->has_overloaded_operator('-'));
23 is_deeply([$meta->get_overloaded_operators], []);
25 is_deeply([$meta->get_overload_list], []);
27 is($meta->get_overloaded_operator('+'), undef);
28 is($meta->get_overloaded_operator('-'), undef);
33 BEGIN { $plus_impl = sub { $plus = 1; "plus" } }
35 package Foo::Overloaded;
37 use overload '+' => $plus_impl;
41 my $meta = Foo::Overloaded->meta;
43 ok($meta->is_overloaded);
45 ok($meta->has_overloaded_operator('+'));
46 ok(!$meta->has_overloaded_operator('-'));
48 is_deeply([$meta->get_overloaded_operators], ['+']);
50 my @overloads = $meta->get_overload_list;
51 is(scalar(@overloads), 1);
52 my $plus_meth = $overloads[0];
53 isa_ok($plus_meth, 'Class::MOP::Method::Overload');
54 is($plus_meth->operator, '+');
55 is($plus_meth->name, '(+');
56 is($plus_meth->body, $plus_impl);
57 is($plus_meth->package_name, 'Foo::Overloaded');
58 is($plus_meth->associated_metaclass, $meta);
60 my $plus_meth2 = $meta->get_overloaded_operator('+');
61 { local $TODO = "we don't cache these yet";
62 is($plus_meth2, $plus_meth);
64 is($plus_meth2->operator, '+');
65 is($plus_meth2->body, $plus_impl);
66 is($meta->get_overloaded_operator('-'), undef);
69 is(Foo::Overloaded->new + Foo::Overloaded->new, "plus");
73 my $minus_impl = sub { $minus = 1; "minus" };
75 like(exception { Foo::Overloaded->new - Foo::Overloaded->new },
76 qr/Operation "-": no method found/);
78 $meta->add_overloaded_operator('-' => $minus_impl);
80 ok($meta->has_overloaded_operator('-'));
82 is_deeply([sort $meta->get_overloaded_operators], ['+', '-']);
84 is(scalar($meta->get_overload_list), 2);
86 my $minus_meth = $meta->get_overloaded_operator('-');
87 isa_ok($minus_meth, 'Class::MOP::Method::Overload');
88 is($minus_meth->operator, '-');
89 is($minus_meth->name, '(-');
90 is($minus_meth->body, $minus_impl);
91 is($minus_meth->package_name, 'Foo::Overloaded');
92 is($minus_meth->associated_metaclass, $meta);
95 is(Foo::Overloaded->new - Foo::Overloaded->new, "minus");