summaryrefslogtreecommitdiffstats
path: root/lib/MooseX/ABC/Trait/Class.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/MooseX/ABC/Trait/Class.pm')
-rw-r--r--lib/MooseX/ABC/Trait/Class.pm31
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;