add compose()