refine the function hack