--- /dev/null
+#!/usr/bin/perl
+# This is automatically generated by author/import-moose-test.pl.
+# DO NOT EDIT THIS FILE. ANY CHANGES WILL BE LOST!!!
+use t::lib::MooseCompat;
+
+use strict;
+use warnings;
+
+use Test::More;
+$TODO = q{Mouse is not yet completed};
+use Test::Exception;
+
+=pod
+
+NOTE:
+A fair amount of these tests will likely be irrelevant
+once we have more fine grained control over the class
+building process. A lot of the edge cases tested here
+are actually related to class construction order and
+not any real functionality.
+- SL
+
+Role which requires a method implemented
+in another role as an override (it does
+not remove the requirement)
+
+=cut
+
+{
+ package Role::RequireFoo;
+ use strict;
+ use warnings;
+ use Mouse::Role;
+
+ requires 'foo';
+
+ package Role::ProvideFoo;
+ use strict;
+ use warnings;
+ use Mouse::Role;
+
+ ::lives_ok {
+ with 'Role::RequireFoo';
+ } '... the required "foo" method will not exist yet (but we will live)';
+
+ override 'foo' => sub { 'Role::ProvideFoo::foo' };
+}
+
+is_deeply(
+ [ Role::ProvideFoo->meta->get_required_method_list ],
+ [ 'foo' ],
+ '... foo method is still required for Role::ProvideFoo');
+
+=pod
+
+Role which requires a method implemented
+in the consuming class as an override.
+It will fail since method modifiers are
+second class citizens.
+
+=cut
+
+{
+ package Class::ProvideFoo::Base;
+ use Mouse;
+
+ sub foo { 'Class::ProvideFoo::Base::foo' }
+
+ package Class::ProvideFoo::Override1;
+ use Mouse;
+
+ extends 'Class::ProvideFoo::Base';
+
+ ::lives_ok {
+ with 'Role::RequireFoo';
+ } '... the required "foo" method will be found in the superclass';
+
+ override 'foo' => sub { 'Class::ProvideFoo::foo' };
+
+ package Class::ProvideFoo::Override2;
+ use Mouse;
+
+ extends 'Class::ProvideFoo::Base';
+
+ override 'foo' => sub { 'Class::ProvideFoo::foo' };
+
+ ::lives_ok {
+ with 'Role::RequireFoo';
+ } '... the required "foo" method exists, although it is overriden locally';
+
+}
+
+=pod
+
+Now same thing, but with a before
+method modifier.
+
+=cut
+
+{
+ package Class::ProvideFoo::Before1;
+ use Mouse;
+
+ extends 'Class::ProvideFoo::Base';
+
+ ::lives_ok {
+ with 'Role::RequireFoo';
+ } '... the required "foo" method will be found in the superclass';
+
+ before 'foo' => sub { 'Class::ProvideFoo::foo:before' };
+
+ package Class::ProvideFoo::Before2;
+ use Mouse;
+
+ extends 'Class::ProvideFoo::Base';
+
+ before 'foo' => sub { 'Class::ProvideFoo::foo:before' };
+
+ ::lives_ok {
+ with 'Role::RequireFoo';
+ } '... the required "foo" method exists, although it is a before modifier locally';
+
+ package Class::ProvideFoo::Before3;
+ use Mouse;
+
+ extends 'Class::ProvideFoo::Base';
+
+ sub foo { 'Class::ProvideFoo::foo' }
+ before 'foo' => sub { 'Class::ProvideFoo::foo:before' };
+
+ ::lives_ok {
+ with 'Role::RequireFoo';
+ } '... the required "foo" method exists locally, and it is modified locally';
+
+ package Class::ProvideFoo::Before4;
+ use Mouse;
+
+ extends 'Class::ProvideFoo::Base';
+
+ sub foo { 'Class::ProvideFoo::foo' }
+ before 'foo' => sub { 'Class::ProvideFoo::foo:before' };
+
+ ::isa_ok(__PACKAGE__->meta->get_method('foo'), 'Mouse::Meta::Method');
+ ::is(__PACKAGE__->meta->get_method('foo')->get_original_method->package_name, __PACKAGE__,
+ '... but the original method is from our package');
+
+ ::lives_ok {
+ with 'Role::RequireFoo';
+ } '... the required "foo" method exists in the symbol table (and we will live)';
+
+}
+
+=pod
+
+Now same thing, but with a method from an attribute
+method modifier.
+
+=cut
+
+{
+
+ package Class::ProvideFoo::Attr1;
+ use Mouse;
+
+ extends 'Class::ProvideFoo::Base';
+
+ ::lives_ok {
+ with 'Role::RequireFoo';
+ } '... the required "foo" method will be found in the superclass (but then overriden)';
+
+ has 'foo' => (is => 'ro');
+
+ package Class::ProvideFoo::Attr2;
+ use Mouse;
+
+ extends 'Class::ProvideFoo::Base';
+
+ has 'foo' => (is => 'ro');
+
+ ::lives_ok {
+ with 'Role::RequireFoo';
+ } '... the required "foo" method exists, and is an accessor';
+}
+
+# ...
+# a method required in a role, but then
+# implemented in the superclass (as an
+# attribute accessor too)
+
+{
+ package Foo::Class::Base;
+ use Mouse;
+
+ has 'bar' => (
+ isa => 'Int',
+ is => 'rw',
+ default => sub { 1 }
+ );
+}
+{
+ package Foo::Role;
+ use Mouse::Role;
+
+ requires 'bar';
+
+ has 'foo' => (
+ isa => 'Int',
+ is => 'rw',
+ lazy => 1,
+ default => sub { (shift)->bar + 1 }
+ );
+}
+{
+ package Foo::Class::Child;
+ use Mouse;
+ extends 'Foo::Class::Base';
+
+ ::lives_ok {
+ with 'Foo::Role';
+ } '... our role combined successfully';
+}
+
+# a method required in a role and implemented in a superclass, with a method
+# modifier in the subclass. this should live, but dies in 0.26 -- hdp,
+# 2007-10-11
+
+{
+ package Bar::Class::Base;
+ use Mouse;
+
+ sub bar { "hello!" }
+}
+{
+ package Bar::Role;
+ use Mouse::Role;
+ requires 'bar';
+}
+{
+ package Bar::Class::Child;
+ use Mouse;
+ extends 'Bar::Class::Base';
+ after bar => sub { "o noes" };
+ # technically we could run lives_ok here, too, but putting it into a
+ # grandchild class makes it more obvious why this matters.
+}
+{
+ package Bar::Class::Grandchild;
+ use Mouse;
+ extends 'Bar::Class::Child';
+ ::lives_ok {
+ with 'Bar::Role';
+ } 'required method exists in superclass as non-modifier, so we live';
+}
+
+{
+ package Bar2::Class::Base;
+ use Mouse;
+
+ sub bar { "hello!" }
+}
+{
+ package Bar2::Role;
+ use Mouse::Role;
+ requires 'bar';
+}
+{
+ package Bar2::Class::Child;
+ use Mouse;
+ extends 'Bar2::Class::Base';
+ override bar => sub { "o noes" };
+ # technically we could run lives_ok here, too, but putting it into a
+ # grandchild class makes it more obvious why this matters.
+}
+{
+ package Bar2::Class::Grandchild;
+ use Mouse;
+ extends 'Bar2::Class::Child';
+ ::lives_ok {
+ with 'Bar2::Role';
+ } 'required method exists in superclass as non-modifier, so we live';
+}
+
+done_testing;