public IObjectChangeTrackingConfiguration TrackThisTypeRecursive(Type rootType, Action <IConfigurableTrackableType> configure = null, TypeSearchSettings searchSettings = null)
        {
            TrackableType trackableRoot = new TrackableType(this, rootType);

            ConfigureWithAttributes(trackableRoot);
            List <TrackableType> trackableTypes = null;

            searchSettings = searchSettings ?? DefaultSearchSettings;

            if (searchSettings.Filter == null)
            {
                searchSettings.Filter = t => t.GetTypeInfo().Assembly == rootType.GetTypeInfo().Assembly;
            }

            if (searchSettings.Mode == TypeSearchMode.AttributeConfigurationOnly)
            {
                Func <Type, bool> initialFilter = searchSettings.Filter;
                searchSettings.Filter = t => initialFilter(t) && t.GetTypeInfo().GetCustomAttribute <ChangeTrackableAttribute>() != null;
            }

            trackableTypes = new List <TrackableType>
                             (
                rootType.GetAllPropertyTypesRecursive(p => p.PropertyType.GetTypeInfo().IsClass&& searchSettings.Filter(p.PropertyType)).Select
                (
                    t =>
            {
                TrackableType trackableType = new TrackableType(this, t);
                ConfigureWithAttributes(trackableType);
                configure?.Invoke(trackableType);

                return(trackableType);
            }
                )
                             );

            trackableTypes.Insert(0, new TrackableType(this, rootType));

            foreach (ITrackableType trackableType in trackableTypes)
            {
                if (!trackableType.Type.GetTypeInfo().IsInterface)
                {
                    TrackableTypes.Add(trackableType);
                }
                else
                {
                    TrackableInterfaceTypes.Add(trackableType);
                }
            }

            return(this);
        }
        public IObjectChangeTrackingConfiguration TrackThisType(Type type, Action <IConfigurableTrackableType> configure = null)
        {
            TrackableType trackableType = new TrackableType(this, type);

            ConfigureWithAttributes(trackableType);
            configure?.Invoke(trackableType);

            if (!trackableType.Type.GetTypeInfo().IsInterface)
            {
                TrackableTypes.Add(trackableType);
            }
            else
            {
                TrackableInterfaceTypes.Add(trackableType);
            }

            return(this);
        }