Вероятно, самый простой вариант - создать тип, который предоставляет пользовательский метод parameterize
, а затем с помощью MOP создать тип подмножества на основе этого:
class MoreThan {
method ^parameterize(Mu, $limit) {
Metamodel::SubsetHOW.new_type:
name => "more than $limit",
refinee => Numeric,
refinement => * > $limit
}
}
Тогда это:
my MoreThan[0] $x = 1;
say $x;
my MoreThan[2] $y = 3;
say $y;
$y = 1;
Производит:
1
3
Type check failed in assignment to $y; expected more than 2 but got Int (1)
in block <unit> at ss.p6 line 14