X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMouse.git;a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FRole.pm;h=ebb929fe0a7c68a51ee0b81fcdf8bca1166db943;hp=07203c376c51c7e394e4aede792a8b2433c8d940;hb=59089ec36675c7df1998945b1446c37794f88306;hpb=fdec46ff3fe73d4026211a06966d9320b222ea26 diff --git a/lib/Mouse/Meta/Role.pm b/lib/Mouse/Meta/Role.pm index 07203c3..ebb929f 100644 --- a/lib/Mouse/Meta/Role.pm +++ b/lib/Mouse/Meta/Role.pm @@ -2,6 +2,7 @@ package Mouse::Meta::Role; use strict; use warnings; +use Carp 'confess'; do { my %METACLASS_CACHE; @@ -27,13 +28,20 @@ sub new { my $class = shift; my %args = @_; - $args{attributes} ||= {}; + $args{attributes} ||= {}; + $args{required_methods} ||= []; bless \%args, $class; } sub name { $_[0]->{name} } +sub add_required_methods { + my $self = shift; + my @methods = @_; + push @{$self->{required_methods}}, @methods; +} + sub add_attribute { my $self = shift; my $name = shift; @@ -49,6 +57,12 @@ sub apply { my $self = shift; my $class = shift; + for my $name (@{$self->{required_methods}}) { + unless ($class->name->can($name)) { + confess "'@{[ $self->name ]}' requires the method '$name' to be implemented by '@{[ $class->name ]}'"; + } + } + for my $name ($self->get_attribute_list) { next if $class->has_attribute($name); my $spec = $self->get_attribute($name);