branch by abstraction