multi trait_mod:<is>(Mu $class, :$stricted) {
my &meth = method (*%pars, |) {
my @pars = %pars.keys;
my $attrs = set self.^attributes.map(*.name.substr: 2);
my @wrong = @pars.grep: * !(elem) $attrs;
die "Wrong named parameters: @wrong[]" if @wrong;
nextsame
}
if $class.^find_method: "TWEAK" -> $_ {
.wrap: &meth
} else {
$class.^add_method: "TWEAK", &meth
}
}
class Bla {
has $.a;
}
class Ble is Bla {
has $.b;
}
class Bli is Ble is stricted {
has $.c;
}
say Bli.new: :a, :b, :c;
say Bli.new: :a, :b, :c, :d;