private Action<?> walk(AmObject cobj) { Action<?> action = visitor.preorderVisit(cobj, context); if (action == null) action = Action.next(); final AmObject walkObj = extractWalkObject(cobj, action); if (walkObj != null) { // walk children UpdatingIterator it = getChildrenOf(walkObj); context.getAmParents().addLast(walkObj); while (it.hasNext()) { AmObject child = it.next(); Action<?> childAction = walk(child); processAction(childAction, it); } context.getAmParents().removeLast(); } Action<?> postAction = visitor.postorderVisit(walkObj != null ? walkObj : cobj, context, action); if (postAction == null) postAction = Action.next; action = action.mergeWith(postAction); return action; }