this is the basic idea