HOOK: (send) io-backend ( packet addrspec datagram -- ) M: unix (send) [ make-sockaddr/size ] [ [ handle>> ] keep ] bi* do-send ; ERROR: invalid-port object ; : check-port ( packet addrspec port -- packet addrspec port ) 2dup addr>> [ class ] bi@ assert= pick class byte-array assert= ; : check-connectionless-port ( port -- port ) dup { [ datagram-port? ] [ raw-port? ] } 1|| [ invalid-port ] unless ; : check-send ( packet addrspec port -- packet addrspec port ) check-connectionless-port dup check-disposed check-port ; : send ( packet addrspec datagram -- ) check-send (send) ; --------------------- V: send ( packet addrspec datagram -- ) check-connectionless-port dup check-disposed check-port ; : send ( packet addrspec datagram -- ) (send) ; or V: send check-connectionless-port ; V: send dup check-disposed ; V: send check-port ; : send ( packet addrspec datagram -- ) (send) ; Calling send would call all of the V: validators as before-methods (in random order). Calling send-unsafe would call (send) directly. V: could require leaving all the arguments on the stack or dropping them. You could also do more things with static type declarations and multimethods.