Demonstrate how to define a type that behaves like an integer but has a lowest valid value of 1 and a highest valid value of 10. Include all bounds checking you need to write, or explain how the compiler or interpreter creates those bounds checks for you.

subset Integer    < Number  { .is_int }
subset MyIntLimit < Integer { . ~~ (1 ..^ 10) }
 
class MyInt(value < MyIntLimit) {
 
    method to_s      { value.to_s }
    method get_value { value.get_value }
 
    method ==(Number x) { value == x }
    method ==(MyInt  x) { value == x.value }
 
    method AUTOLOAD(_, name, *args) {
        var results = [value.(name)(args.map {|n| Number(n) }...)]
        results.map{|r| r.kind_of(Number) ? MyInt(r.int) : r}...
    }
}
 
#
## Example:
#
var a = MyInt(2)    # creates a new object of type `MyInt`
a += 7              # adds 7 to a
say a               # => 9
say a/2             # => 4
 
var b = (a - 3)     # b is of type `MyInt`
say b               # => 6
 
say a.as_hex.dump   # => "9" -- an hexadecimal string
 
a -= 6              # a=3
var c = (a + b)     # MyInt(3) + MyInt(6)
say c               # => 9
say c.class         # => MyInt
 
a *= 2              # a=6
say a+b             # error: class `MyInt` does not match MyInt(12)