add more func and lazy eval