# Pastebin NwcmKKWA role Optional[::Type = Any] { has Type $.obj; method say(::?CLASS:_: *%h, *@a) { self } method FALLBACK(::?CLASS:D: Str $meth, *%h, *@a) { self but False } } multi sub postfix:(Optional:D $obj) { $obj.obj // $obj but False } multi sub postfix:(Optional:D $obj) { $obj.obj // fail qq } multi sub postfix:(Optional:U $obj) { $obj.new() but False } multi sub postfix:(Optional:U $obj) { fail qq } use MONKEY-TYPING; augment class Any { method Optional() { Optional[self.WHAT].new(:obj(self)) } } my Optional of Int $x; $x = 42.Optional; $x?.say; $x!.say; my Optional of Int $y; $y?.say; $y!.say;