block passing is optional