/// <summary>
        ///   Gets an array containing all distributions that can be dynamically build by
        ///   this application by inspecting Accord.NET assemblies using reflection.
        /// </summary>
        ///
        public static DistributionViewModel[] GetDistributions(MainViewModel owner)
        {
            // This function iterates the Accord.Statistics assembly looking for
            // classes that are concrete (not abstract) and that implement the
            // IUnivariateDistribution interface. Then, it attempts to create a
            // DistributionViewModel from the distribution's type by using the
            // DistributionViewModel.TryParse method.

            var baseType = typeof(IUnivariateDistribution);

            var assembly = Assembly.GetAssembly(baseType);

            // Prepare and leave Accord.NET documentation parsed
            var doc = GetDocumentation(assembly);

            // Get all univariate distributions in Accord.NET:
            var distributions = assembly.GetTypes()
                                .Where(p => baseType.IsAssignableFrom(p) && !p.IsAbstract && !p.IsInterface);

            // Get only those that can be dynamically built:
            var buildable = new List <DistributionViewModel>();

            foreach (Type type in distributions)
            {
                DistributionViewModel distribution;
                if (DistributionViewModel.TryParse(owner, type, doc, out distribution))
                {
                    buildable.Add(distribution);
                }
            }

            buildable.Sort((a, b) => a.Name.CompareTo(b.Name));

            return(buildable.ToArray());
        }