internal static T ToThingBase <T>(this DocumentReference documentReference) where T : ThingBase, new()
        {
            T baseThing = new T();

            Guid id;

            if (Guid.TryParse(documentReference.Id, out id))
            {
                baseThing.Key = new ThingKey(id);
            }

            Guid version;

            if (documentReference.Meta != null && documentReference.Meta.VersionId != null && Guid.TryParse(documentReference.Meta.VersionId, out version))
            {
                baseThing.Key.VersionStamp = version;
            }

            ThingFlags flags;
            var        extensionFlag = documentReference.GetExtension(HealthVaultExtensions.FlagsFhirExtensionName);

            if (extensionFlag != null)
            {
                if (extensionFlag.Value is FhirString && Enum.TryParse <ThingFlags>((extensionFlag.Value as FhirString).ToString(), out flags))
                {
                    baseThing.Flags = flags;
                }
            }

            if (documentReference.Indexed.HasValue)
            {
                var indexed = documentReference.Indexed.Value;
                baseThing.EffectiveDate = new NodaTime.LocalDateTime(indexed.Year, indexed.Month, indexed.Day, indexed.Hour, indexed.Minute, indexed.Second);
            }

            return(baseThing);
        }