#!/usr/bin/env perl6 use v6; class Term::Choose { has %.opt_global; has %!opt; method new ( %opt_global? ) { validate_options( %opt_global ); %opt_global //= 'AAAAA'; %opt_global //= 1; self.bless( :%opt_global ); } sub valid_options { return { justify => '<[ 0 1 2 ]>', lf => 'Array', mark => 'Array', prompt => 'Str', }; }; sub validate_options ( %opt ) { return without %opt; my $valid = valid_options(); for %opt.kv -> $key, $value { when $valid{$key}:!exists { die "'$key' is not a valid option name"; } when ! defined $value { next; } when $valid{$key} eq 'Array' { die "$key => not an ARRAY reference." if ! $value.isa( Array ); die "$key => invalid array element" if $value !~~ /^<[0..9]>+$/; # Int; die "$key => too many array elemnts." if $key eq 'lf' && $value.elems > 2; } when $valid{$key} eq 'Str' { die "$key => not a string." if ! $value.isa( Str ); } when $value !~~ m/^{$valid{$key}}$/ { die "$key => '$value' is not a valid value."; } } } method choose ( Array $orig_list, %!opt? ) { validate_options( %!opt ); for %!opt_global.kv -> $key, $value { %!opt{$key} //= $value; } printf "%-7s: %s\n", .key, .value for %!opt.pairs; print "\n"; # do something with $orig_list } } my $n = Term::Choose.new( { mark => [ 4 .. 7 ] } ); $n.choose( [ 1 .. 10 ] ); $n.choose( [ 1 .. 10 ], { prompt => 'BBBBB', mark => [ 1 .. 3 ] } ); $n.choose( [ 1 .. 10 ] );