public T GetValue(object culture)
        {
            var cultureKey = CultureKey.Parse(culture);

            ResourceLanguage language;

            if (!_languages.TryGetValue(cultureKey, out language))
            {
                return(default(T));
            }

            Contract.Assume(language != null);

            return(_getter(language));
        }
        private static IEnumerable <CultureKey> CastLanguages(object languages)
        {
            var obj = languages.PsObjectCast <object>();

            switch (obj)
            {
            case string str:
                return(new[] { CultureKey.Parse(str) });

            case IEnumerable enumerable:
                return(enumerable.PsCast <object>().Select(CultureKey.Parse).ToArray());

            default:
                return(new[] { CultureKey.Parse(obj.PsObjectCast <object>()) });
            }
        }
        public bool SetValue(object culture, T value)
        {
            var cultureKey = CultureKey.Parse(culture);

            ResourceLanguage language;

            if (!_languages.TryGetValue(cultureKey, out language))
            {
                throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Resources.LanguageNotDefinedError, cultureKey.Culture));
            }

            if (!_setter(language, value))
            {
                return(false);
            }

            OnValueChanged();
            return(true);
        }
        private static IEnumerable <CultureKey> CastLanguages(object languages)
        {
            IEnumerable <CultureKey> resourceLanguages = null;

            switch (languages.PsObjectCast <object>())
            {
            case string str:
                resourceLanguages = new[] { CultureKey.Parse(str) };
                break;

            case IEnumerable enumerable:
                resourceLanguages = enumerable.PsCast <object>().Select(CultureKey.Parse).ToArray();
                break;

            case object obj:
                resourceLanguages = new[] { CultureKey.Parse(obj.PsObjectCast <object>()) };
                break;
            }

            return(resourceLanguages);
        }
        public ResourceScope([NotNull] object entries, [NotNull] object languages, [NotNull] object comments)
        {
            Contract.Requires(entries != null);
            Contract.Requires(languages != null);
            Contract.Requires(comments != null);

            // ReSharper disable AssignNullToNotNullAttribute
            Entries = entries.PsObjectCast <object>().TryCast().Returning <IEnumerable <ResourceTableEntry> >()
                      .When <IEnumerable>(item => item.PsCast <ResourceTableEntry>().ToArray())
                      .When <object>(item => new[] { item.PsObjectCast <ResourceTableEntry>() })
                      .Result;

            if (Entries == null)
            {
                throw new ArgumentException("Invalid input", nameof(entries));
            }

            Languages = languages.PsObjectCast <object>().TryCast().Returning <IEnumerable <CultureKey> >()
                        .When <string>(item => new[] { CultureKey.Parse(item) })
                        .When <IEnumerable>(item => item.PsCast <object>().Select(CultureKey.Parse).ToArray())
                        .When <object>(item => new[] { CultureKey.Parse(item.PsObjectCast <object>()) })
                        .Result;

            if (Languages == null)
            {
                throw new ArgumentException("Invalid input", nameof(languages));
            }

            Comments = comments.PsObjectCast <object>().TryCast().Returning <IEnumerable <CultureKey> >()
                       .When <string>(item => new[] { CultureKey.Parse(item) })
                       .When <IEnumerable>(item => item.PsCast <object>().Select(CultureKey.Parse).ToArray())
                       .When <object>(item => new[] { CultureKey.Parse(item.PsObjectCast <object>()) })
                       .Result;
            // ReSharper restore AssignNullToNotNullAttribute

            if (Comments == null)
            {
                throw new ArgumentException("Invalid input", nameof(comments));
            }
        }