diff options
Diffstat (limited to 'lib/MooseX/ABC/Trait/Class.pm')
-rw-r--r-- | lib/MooseX/ABC/Trait/Class.pm | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/MooseX/ABC/Trait/Class.pm b/lib/MooseX/ABC/Trait/Class.pm new file mode 100644 index 0000000..c8b7341 --- /dev/null +++ b/lib/MooseX/ABC/Trait/Class.pm @@ -0,0 +1,31 @@ +package MooseX::ABC::Trait::Class; +use Moose::Role; +use MooseX::AttributeHelpers; + +has required_methods => ( + metaclass => 'Collection::Array', + is => 'ro', + isa => 'ArrayRef[Str]', + default => sub { [] }, + provides => { + push => 'add_required_method', + }, +); + +after _superclasses_updated => sub { + my $self = shift; + for my $superclass ($self->linearized_isa) { + my $super_meta = Class::MOP::class_of($superclass); + next unless $super_meta->does_role('MooseX::ABC::Trait::Class'); + for my $method ($super_meta->required_methods) { + if (!$self->find_method_by_name($method)) { + my $classname = $self->name; + die "$superclass requires $classname to implement $method"; + } + } + } +}; + +no Moose::Role; + +1; |