interface is really hard to define.