protected IObjectTypeConfig <S, T> Config(IObjectTypeConfig <S, T> config)
        {
            return(new ObjectTypeConfig <S, T>
            {
                Name = config.Name ?? Name,

                Hooks = new[] { Hooks, config.Hooks }
                .SelectMany(d => d)
                .GroupBy
                (
                    kvp => kvp.Key,
                    (key, kvps) => new { Key = key, Value = kvps.SelectMany(x => x.Value).ToList() }
                )
                .ToDictionary(x => x.Key, y => y.Value),

                Mutables = config.Mutables.Concat(Mutables).ToList(),

                Volatiles = config.Volatiles.Concat(Volatiles).ToList(),

                Views = Views.Concat(config.Views).Distinct().ToList(),

                Actions = Actions.Concat(config.Actions).Distinct().ToList(),

                Initializers = config.Initializers.Concat(Initializers).ToList(),

                PreProcessor = config.PreProcessor ?? PreProcessor,

                Proxify = config.Proxify ?? Proxify,

                Snapshoty = config.Snapshoty ?? Snapshoty
            });
        }
        protected ObjectType(IObjectTypeConfig <S, T> config) : base(config.Name ?? "AnonymousObject")
        {
            ShouldAttachNode = true;

            Flags = TypeFlags.Object;

            Initializers = config.Initializers;

            PreProcessor = config.PreProcessor;

            Mutables = config.Mutables;

            Views = config.Views;

            Hooks = config.Hooks;

            Volatiles = config.Volatiles;

            Actions = config.Actions;

            Proxify = config.Proxify;

            Snapshoty = config.Snapshoty;

            Properties = ToProperties();

            IdentifierAttribute = FindIdentifierAttribute();
        }
 public static IObjectType <T> Object <T>(IObjectTypeConfig <IDictionary <string, object>, T> config)
 {
     return(new ObjectType <T>(config));
 }
 public static IObjectType <S, T> Object <S, T>(IObjectTypeConfig <S, T> config) where S : class
 {
     return(new ObjectType <S, T>(config));
 }
 protected abstract I Enhance(IObjectTypeConfig <S, T> config);
 private I EnhanceWith(IObjectTypeConfig <S, T> config)
 {
     return(Enhance(Config(config)));
 }