use 5.010001; use strict; use warnings; package Mite::Trait::HasRequiredMethods; use Mite::Miteception -role, -all; our $AUTHORITY = 'cpan:TOBYINK'; our $VERSION = '0.012000'; has required_methods => is => ro, isa => ArrayRef[MethodName], builder => sub { [] }; sub add_required_methods { my $self = shift; push @{ $self->required_methods }, @_; return; } before inject_mite_functions => sub { my ( $self, $file, $arg ) = ( shift, @_ ); my $requested = sub { $arg->{$_[0]} ? 1 : $arg->{'!'.$_[0]} ? 0 : $arg->{'-all'} ? 1 : $_[1]; }; my $defaults = ! $arg->{'!-defaults'}; my $shim = $self->shim_name; my $package = $self->name; no strict 'refs'; if ( $requested->( 'requires', $defaults ) ) { *{ $package .'::requires' } = sub { $self->add_required_methods( @_ ); return; }; $self->imported_keywords->{requires} = 'sub {}'; } }; around _compile_mop_required_methods => sub { my ( $next, $self ) = ( shift, shift ); my $code = $self->$next( @_ ); $code .= "\n" if $code; if ( my @req = @{ $self->required_methods } ) { $code .= sprintf " \$PACKAGE->add_required_methods( %s );\n", join( q{, }, map B::perlstring( $_ ), @req ), } return $code; }; 1;