Uma das soluções completas possíveis, usando a ideia do @pnicholas