/// <summary>
 /// Creates an element-data object.
 /// </summary>
 public ElementData(
     Func <ElementLocalData> localDataGetter, ElementClassSet classes  = null, IReadOnlyCollection <FlowComponentOrNode> children = null,
     IReadOnlyCollection <EtherealComponentOrElement> etherealChildren = null)
 {
     classes        = classes ?? ElementClassSet.Empty;
     NodeDataGetter = context => {
         classes.AddElementId(context.Id);
         return(new ElementNodeData(() => localDataGetter().NodeDataGetter(classes), children: children, etherealChildren: etherealChildren));
     };
 }
        /// <summary>
        /// Creates an element-data object.
        /// </summary>
        /// <param name="localDataGetter"></param>
        /// <param name="classes"></param>
        /// <param name="clientSideIdReferences">The <see cref="ElementId"/> and <see cref="ElementIdSet"/> objects to which you’d like to add this element’s
        /// client-side ID.</param>
        /// <param name="clientSideIdOverride">Pass a nonempty string to override the client-side ID of the element, which is useful if you need a static value that
        /// you can reference from CSS or JavaScript files. The ID you specify should be unique on the page. Do not pass null. Use with caution.</param>
        /// <param name="children"></param>
        /// <param name="etherealChildren"></param>
        public ElementData(
            Func <ElementLocalData> localDataGetter, ElementClassSet classes = null, IEnumerable <ElementIdReference> clientSideIdReferences = null,
            string clientSideIdOverride = "", IReadOnlyCollection <FlowComponentOrNode> children = null,
            IReadOnlyCollection <EtherealComponentOrElement> etherealChildren = null)
        {
            classes        = classes ?? ElementClassSet.Empty;
            NodeDataGetter = context => {
                var clientSideId = clientSideIdOverride.Any() ? clientSideIdOverride : context.Id;
                classes.AddElementId(clientSideId);
                foreach (var i in clientSideIdReferences ?? Enumerable.Empty <ElementIdReference>())
                {
                    i.AddId(clientSideId);
                }

                return(new ElementNodeData(
                           clientSideIdOverride,
                           () => localDataGetter().NodeDataGetter(classes),
                           children: children,
                           etherealChildren: etherealChildren));
            };
        }