protected override void VisitNode(INodeModel nodeModel, HashSet <INodeModel> visitedNodes)
        {
            // recurse first
            base.VisitNode(nodeModel, visitedNodes);

            if (nodeModel == null)
            {
                return;
            }

            foreach (var callback in Callbacks)
            {
                callback(nodeModel);
            }

            // do after left recursion, so the leftmost node is processed first
            foreach (var inputPortModel in nodeModel.InputsByDisplayOrder)
            {
                bool any = false;

                foreach (var connection in inputPortModel.ConnectionPortModels)
                {
                    any = true;
                    nodeModel.OnConnection(inputPortModel, connection);
                }

                if (!any)
                {
                    nodeModel.OnConnection(inputPortModel, null);
                }
            }

            foreach (var outputPortModel in nodeModel.OutputsByDisplayOrder)
            {
                bool any = false;

                foreach (var connection in outputPortModel.ConnectionPortModels)
                {
                    any = true;
                    nodeModel.OnConnection(outputPortModel, connection);
                }

                if (!any)
                {
                    nodeModel.OnConnection(outputPortModel, null);
                }
            }
        }