public IObjectChangeTrackingConfiguration TrackTypesFromAssembly(Assembly assembly, Action <IConfigurableTrackableType> configure = null, TypeSearchSettings searchSettings = null)
        {
            searchSettings = searchSettings ?? DefaultSearchSettings;

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

            foreach (Type type in assembly.GetTypes())
            {
                if (searchSettings.Filter == null || searchSettings.Filter(type))
                {
                    if (!searchSettings.Recursive)
                    {
                        TrackThisType(type, configure);
                    }
                    else
                    {
                        TrackThisTypeRecursive(type, configure, searchSettings);
                    }
                }
            }

            return(this);
        }
        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 TrackTypesFromAssembly(string assemblyName, Action <IConfigurableTrackableType> configure = null, TypeSearchSettings searchSettings = null)
 {
     return(TrackTypesFromAssembly(Assembly.Load(new AssemblyName(assemblyName)), configure, searchSettings));
 }
 public IObjectChangeTrackingConfiguration TrackThisTypeRecursive <TRoot>(Action <IConfigurableTrackableType> configure = null, TypeSearchSettings searchSettings = null)
 {
     return(TrackThisTypeRecursive(typeof(TRoot), configure, searchSettings));
 }