/// <summary>
        /// Performs a depth-first walk of the tree
        /// </summary>
        public void Walk(IParamWalker callback)
        {
            callback.PreArgument(0, Children.Count);

            for (int i = 0; i < Children.Count; i++)
            {
                WalkWorker(callback, Children[i], 0);
            }
            callback.PostArgument(0);
        }
        private void WalkWorker(IParamWalker callback, ParamTreeNode curNode, int depth)
        {
            callback.Walk(depth, curNode);

            if (curNode.Children.Count != 0)
            {
                callback.PreArgument(depth + 1, curNode.Children.Count);

                for (int i = 0; i < curNode.Children.Count; i++)
                {
                    WalkWorker(callback, curNode.Children[i], depth + 1);
                }

                callback.PostArgument(depth + 1);
            }
        }