| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | 
							- namespace Caliburn.Micro
 
- {
 
-     using System;
 
-     using System.Collections.Generic;
 
-     using System.Collections.Specialized;
 
-     using System.ComponentModel;
 
-     using System.Linq;
 
-     using System.Reflection;
 
- #if !WinRT
 
-     using System.Windows;
 
-     using Caliburn.Micro.Core;
 
- #else
 
-     using Windows.UI.Xaml;
 
- #endif
 
-     /// <summary>
 
-     /// A source of assemblies that are inspectable by the framework.
 
-     /// </summary>
 
-     public static class AssemblySource {
 
-         /// <summary>
 
-         /// The singleton instance of the AssemblySource used by the framework.
 
-         /// </summary>
 
-         public static readonly IObservableCollection<Assembly> Instance = new BindableCollection<Assembly>();
 
-         /// <summary>
 
-         /// Finds a type which matches one of the elements in the sequence of names.
 
-         /// </summary>
 
-         public static Func<IEnumerable<string>, Type> FindTypeByNames = names => {
 
-             if (names == null) {
 
-                 return null;
 
-             }
 
-             var type = names
 
-                 .Join(Instance.SelectMany(a => a.GetExportedTypes()), n => n, t => t.FullName, (n, t) => t)
 
-                 .FirstOrDefault();
 
-             return type;
 
-         };
 
-     }
 
-     /// <summary>
 
-     /// A caching subsystem for <see cref="AssemblySource"/>.
 
-     /// </summary>
 
-     public static class AssemblySourceCache {
 
-         static bool isInstalled;
 
-         static readonly IDictionary<String, Type> TypeNameCache = new Dictionary<string, Type>();
 
-         /// <summary>
 
-         /// Extracts the types from the spezified assembly for storing in the cache.
 
-         /// </summary>
 
-         public static Func<Assembly, IEnumerable<Type>> ExtractTypes = assembly =>
 
-             assembly.GetExportedTypes()
 
-                 .Where(t =>
 
- #if !CORE
 
-                     typeof(UIElement).IsAssignableFrom(t) ||
 
- #endif
 
-                     typeof(INotifyPropertyChanged).IsAssignableFrom(t));
 
-         /// <summary>
 
-         /// Installs the caching subsystem.
 
-         /// </summary>
 
-         public static void Install() {
 
-             if (isInstalled) return;
 
-             isInstalled = true;
 
-             AssemblySource.Instance.CollectionChanged += (s, e) => {
 
-                 switch (e.Action) {
 
-                     case NotifyCollectionChangedAction.Add:
 
-                         e.NewItems.OfType<Assembly>()
 
-                             .SelectMany(a => ExtractTypes(a))
 
-                             .Apply(t => TypeNameCache.Add(t.FullName, t));
 
-                         break;
 
-                     case NotifyCollectionChangedAction.Remove:
 
-                     case NotifyCollectionChangedAction.Replace:
 
-                     case NotifyCollectionChangedAction.Reset:
 
-                         TypeNameCache.Clear();
 
-                         AssemblySource.Instance
 
-                             .SelectMany(a => ExtractTypes(a))
 
-                             .Apply(t => TypeNameCache.Add(t.FullName, t));
 
-                         break;
 
-                 }
 
-             };
 
-             AssemblySource.Instance.Refresh();
 
-             AssemblySource.FindTypeByNames = names => {
 
-                 if (names == null) {
 
-                     return null;
 
-                 }
 
-                 var type = names.Select(n => TypeNameCache.GetValueOrDefault(n)).FirstOrDefault(t => t != null);
 
-                 return type;
 
-             };
 
-         }
 
-     }
 
- }
 
 
  |