first pass at generic modal