/// <summary>
        ///    Copys data from the template element to this element to clone it.
        /// </summary>
        /// <param name="template"></param>
        /// <returns></returns>
        public virtual void CopyFromTemplate(OverlayElement template)
        {
            PropertyInfo[] props = template.GetType().GetProperties();

            for (int i = 0; i < props.Length; i++)
            {
                PropertyInfo prop = props[i];

                // if the prop is not settable, then skip
                if (!prop.CanWrite || !prop.CanRead)
                {
                    log.Warn(prop.Name);
                    continue;
                }

                object srcVal = prop.GetValue(template, null);
                prop.SetValue(this, srcVal, null);
            }
        }
        /// <summary>
        ///    Copys data from the template element to this element to clone it.
        /// </summary>
        /// <param name="template"></param>
        /// <returns></returns>
        public virtual void CopyFromTemplate(OverlayElement template)
        {
            PropertyInfo[] props = template.GetType().GetProperties();

            for(int i = 0; i < props.Length; i++) {
                PropertyInfo prop = props[i];

                // if the prop is not settable, then skip
                if(!prop.CanWrite || !prop.CanRead) {
                    log.Warn(prop.Name);
                    continue;
                }

                object srcVal = prop.GetValue(template, null);
                prop.SetValue(this, srcVal, null);
            }
        }