reference: https://golangbot.com/interfaces-part-2/