minimum viable solution to #20