From: Shawn M Moore Date: Tue, 25 Nov 2008 08:00:12 +0000 (+0000) Subject: Implement "requires" for parameterized roles X-Git-Tag: 0.05~71 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMooseX-Role-Parameterized.git;a=commitdiff_plain;h=eac6d242a70aa9e5b27b8824d1598d2939a316fc Implement "requires" for parameterized roles --- diff --git a/lib/MooseX/Role/Parameterized.pm b/lib/MooseX/Role/Parameterized.pm index 0ef576e..f145ca3 100644 --- a/lib/MooseX/Role/Parameterized.pm +++ b/lib/MooseX/Role/Parameterized.pm @@ -15,7 +15,7 @@ our $CURRENT_METACLASS; __PACKAGE__->setup_import_methods( with_caller => ['parameter', 'role', 'method'], - as_is => ['has', 'with', 'extends', 'augment', 'inner'], + as_is => ['has', 'with', 'extends', 'requires', 'augment', 'inner'], ); sub parameter { @@ -90,6 +90,13 @@ sub with { Moose::Util::apply_all_roles($CURRENT_METACLASS, @_); } +sub requires { + confess "requires must be called within the role { ... } block." + unless $CURRENT_METACLASS; + croak "Must specify at least one method" unless @_; + $CURRENT_METACLASS->add_required_methods(@_); +} + sub extends { croak "Roles do not currently support 'extends'" } sub inner { croak "Roles cannot support 'inner'" } diff --git a/t/006-requires.t b/t/006-requires.t new file mode 100644 index 0000000..9bc9ba0 --- /dev/null +++ b/t/006-requires.t @@ -0,0 +1,70 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More tests => 5; +use Test::Exception; + +do { + package MyRole::Requires; + use MooseX::Role::Parameterized; + + parameter requires => ( + is => 'rw', + isa => 'Str', + ); + + role { + my $p = shift; + requires $p->requires; + }; +}; + +sub requires_names { + map { + MyRole::Requires->meta->generate_role(requires => $_)->name + } @_ +} + +throws_ok { + Moose::Meta::Class->create_anon_class( + roles => [ requires_names('alpha') ], + ); +} qr/'Moose::Meta::Role::__ANON__::SERIAL::\d+' requires the method 'alpha' to be implemented by 'Class::MOP::Class::__ANON__::SERIAL::\d+'/; + +lives_ok { + Moose::Meta::Class->create_anon_class( + methods => { + alpha => sub {}, + }, + roles => [ requires_names('alpha') ], + ); +}; + +throws_ok { + Moose::Meta::Class->create_anon_class( + methods => { + alpha => sub {}, + }, + roles => [ requires_names('alpha', 'beta') ], + ); +} qr/'Moose::Meta::Role::__ANON__::SERIAL::\d+\|Moose::Meta::Role::__ANON__::SERIAL::\d+' requires the method 'beta' to be implemented by 'Class::MOP::Class::__ANON__::SERIAL::\d+'/; + +throws_ok { + Moose::Meta::Class->create_anon_class( + methods => { + beta => sub {}, + }, + roles => [ requires_names('alpha', 'beta') ], + ); +} qr/'Moose::Meta::Role::__ANON__::SERIAL::\d+\|Moose::Meta::Role::__ANON__::SERIAL::\d+' requires the method 'alpha' to be implemented by 'Class::MOP::Class::__ANON__::SERIAL::\d+'/; + +lives_ok { + Moose::Meta::Class->create_anon_class( + methods => { + alpha => sub {}, + beta => sub {}, + }, + roles => [ requires_names('alpha', 'beta') ], + ); +}; +