SYNOPSIS use Typed::Subroutines; # create a subtype from Sub subset TwoArgSub of Sub where typed_sub(Any, Any); subset TakesIntAndString of Sub where typed_sub(Int, Str); my TwoArgSub $a; my TakesIntAndString $b; $a = sub ($a, $b) { ... }; # lives $a = sub ($a) { ... }; # dies $b = sub (Int $a, Str $b) { ... }; # lives $b = sub (Int $a, $b) { ... }; # dies # validate subroutines passed to your subroutines (dawg) sub doStuff(Int $a, Str $b, &operation where typed_sub(Int, Str)}) { ... } doStuff(99, "bottles of beer", -> Int $a, Str $b { ... }) # lives doStuff(99, "bottles of beer", -> Rat $a, Num $b { ... }) # dies DESCRIPTION Typed::Subroutines let you specify subroutine types verifying the parameter list so you can have better type checking for first-class functions. I'll write more docs when I'm less tired.