public static TypeDescription GetForUse(bool flatten)
        {
            if (Sealed != null && !flatten)
            {
                return(Sealed);
            }

            if (Sealed == null)
            {
                lock (GetForUseLock)
                {
                    if (Sealed != null && !flatten)
                    {
                        return(Sealed);
                    }

                    var    ret = Get();
                    Action postPromise;
                    ret = ret.DePromise(out postPromise);
                    postPromise();

                    ret.Seal();

                    Sealed = ret;
                }
            }

            if (!flatten)
            {
                return(Sealed);
            }

            if (Flattened != null)
            {
                return(Flattened);
            }

            lock (GetForUseLock)
            {
                if (Flattened != null)
                {
                    return(Flattened);
                }

                var ret = Sealed.Clone(new Dictionary <TypeDescription, TypeDescription>());

                Flattener.Flatten(ret, Config.GetIdProvider());

                if (!ret.NeedsMapping)
                {
                    ret.TypeModel = TypeModelBuilder.BuildTypeModel(ret);
                    ret.TypeModel.CompileInPlace();
                }

                Flattened = ret;

                return(Flattened);
            }
        }