some modification to functors