only generate interfaces once