add functional composition