The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package util;

use strict;
use warnings;

my $role_sequence = 0;
sub make_role {
    my %args = @_;

    my $type             = $args{type};
    my $required_methods = $args{required_methods};
    my $methods          = $args{methods} || [];

    my $required_source = '';

    if ( $required_methods && @{$required_methods} ) {
        $required_source = 'requires qw( ';
        $required_source .= join( ' ', @{$required_methods} );
        $required_source .= ' );';
    }

    my $package = 'TestRole' . $role_sequence++;

    my $source = qq{
        package $package;
    
        use $type;
        $required_source
    };

    $source .= join( "\n", @{$methods} );

    if ($args{extra}) {
        $source .= "\n$args{extra}"
    }

    #warn $source;

    eval($source);
    die $@ if $@;

    return $package;
}

1;