Commits

Toby Inkster committed 87e83f5 Draft

MXRP support

Comments (0)

Files changed (2)

lib/Sub/NonRole.pm

 		} $caller;
 	}
 	
-	if ($INC{'Class/MOP.pm'}
-	and my $class_of = 'Class::MOP'->can('class_of'))
+	$INC{'Class/MOP.pm'} or return;
+	my $class_of = 'Class::MOP'->can('class_of') or return;
+	
+	require Moose::Util::MetaRole;
+	_mk_moose_trait();
+	my $meta = $class_of->($caller);
+	
+	if ($meta->can('has_role_generator')) # lolcat
 	{
-		require Moose::Util::MetaRole;
-		_mk_moose_trait();
-		Moose::Util::MetaRole::apply_metaroles(
+		_mk_moose_trait_param();
+		my $P_mc = $meta->parameters_metaclass;
+		my $P_rg = $meta->role_generator;
+		$meta = Moose::Util::MetaRole::apply_metaroles(
+			for => $caller,
+			role_metaroles => {
+				role => ['Sub::NonRole::Trait::ParameterizableRole'],
+			},
+		);
+		$meta->parameters_metaclass($P_mc);
+		$meta->role_generator($P_rg);
+	}
+	else # standard Moose role
+	{
+		$meta = Moose::Util::MetaRole::apply_metaroles(
 			for => $caller,
 			role_metaroles => {
 				role => ['Sub::NonRole::Trait::Role'],
 			},
 		);
-		@{ $class_of->($caller)->non_role_methods } = @subs;
 	}
+	
+	@{ $meta->non_role_methods } = @subs;
 }
 
 my $made_it;
 	};
 }
 
+my $made_it_param;
+sub _mk_moose_trait_param
+{
+	return if $made_it_param++;
+	eval q{
+		package Sub::NonRole::Trait::ParameterizableRole;
+		use Moose::Role;
+		with 'Sub::NonRole::Trait::Role';
+#		around generate_role => sub {
+#			my $orig = shift;
+#			my $self = shift;
+#			my $role = $self->$orig(@_);
+#			return $role;
+#		};
+	};
+}
+
 1;
 
 __END__
    My::Role->other_function();
    My::Role::other_function();
 
-It should work with L<Role::Tiny>, L<Moo::Role> and L<Moose::Role>
-roles.
+It should work with L<Role::Tiny>, L<Moo::Role>, L<Moose::Role> and
+L<MooseX::Role::Parameterized> roles.
 
 =head2 Developer API
 
+=head1 PURPOSE
+
+Check Sub::NonRole works when a MooseX::Role::Parameterized role is
+consumed by a Moose class.
+
+=head1 AUTHOR
+
+Toby Inkster E<lt>tobyink@cpan.orgE<gt>.
+
+=head1 COPYRIGHT AND LICENCE
+
+This software is copyright (c) 2013 by Toby Inkster.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+=cut
+
+use strict;
+use warnings;
+use Test::More;
+use Test::Requires { 'MooseX::Role::Parameterized' => 0 };
+
+{
+	package Local::Role;
+	use MooseX::Role::Parameterized;
+	use Sub::NonRole;
+	parameter value => (isa => 'Int');
+	sub a :NonRole { 42 };
+	sub b          { 99 };
+	role { my $p = shift; method c => sub { $p->value } };
+}
+
+{
+	package Local::Class;
+	use Moose;
+	with 'Local::Role' => { value => 101 };
+}
+
+can_ok 'Local::Role', 'a';
+can_ok 'Local::Role', 'b';
+ok(!'Local::Class'->can('a'), 'method hidden correctly');
+can_ok 'Local::Class', 'b';
+can_ok 'Local::Class', 'c';
+
+is(Local::Class->c, 101);
+
+done_testing;
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.