add field factory + behaviours
rewrite the mapper to handle more options and use event emitter