public T GetFunctionProvider <T>() where T : class, IFunctionProvider
        {
            var functionFolderEntityToken = (this.EntityToken as BaseFunctionFolderElementEntityToken);

            if (functionFolderEntityToken != null)
            {
                var elementProvider = ElementProviderPluginFacade.GetElementProvider(functionFolderEntityToken.ElementProviderName) as BaseFunctionElementProvider;
                if (elementProvider != null)
                {
                    var provider = FunctionProviderPluginFacade.GetFunctionProvider(elementProvider.FunctionProviderName);

                    if (provider is T)
                    {
                        return(provider as T);
                    }
                }
            }

            var functionProviderSettings = ConfigurationServices.ConfigurationSource.GetSection(FunctionProviderSettings.SectionName)
                                           as FunctionProviderSettings;

            var providerNames = functionProviderSettings.FunctionProviderPlugins.Select(plugin => plugin.Name);

            foreach (string providerName in providerNames)
            {
                var provider = FunctionProviderPluginFacade.GetFunctionProvider(providerName);
                if (provider is T)
                {
                    return(provider as T);
                }
            }

            throw new InvalidOperationException("Failed to get instance of " + typeof(T).Name);
        }
        protected override IEnumerable <IMetaFunction> OnGetFunctionsFromProvider(string providerName, FunctionTypesToReturn functionTypesToReturn)
        {
            switch (functionTypesToReturn)
            {
            case FunctionTypesToReturn.StaticDependentFunctions:
                return(FunctionProviderPluginFacade.Functions(providerName));

            case FunctionTypesToReturn.DynamicDependentOnlyFunctions:
                return(FunctionProviderPluginFacade.DynamicTypeDependentFunctions(providerName));

            case FunctionTypesToReturn.AllFunctions:
                IEnumerable <IMetaFunction> functions = FunctionProviderPluginFacade.Functions(providerName);
                return(functions.Concat(FunctionProviderPluginFacade.DynamicTypeDependentFunctions(providerName)));
            }

            throw new NotImplementedException(string.Format("Unexpected FunctionTypesToReturn enumeration value '{0}' from provider '{1}'", functionTypesToReturn, providerName));
        }
        internal void GetProviderAndFunction <FunctionType>(
            FileBasedFunctionEntityToken entityToken,
            out FileBasedFunctionProvider <FunctionType> provider,
            out FileBasedFunction <FunctionType> function) where FunctionType : FileBasedFunction <FunctionType>
        {
            string functionProviderName = entityToken.FunctionProviderName;

            provider = (FileBasedFunctionProvider <FunctionType>)FunctionProviderPluginFacade.GetFunctionProvider(functionProviderName);
            IFunction func = FunctionFacade.GetFunction(entityToken.FunctionName);

            Verify.IsNotNull(func, "Failed to get function '{0}'", entityToken.FunctionName);

            if (func is FunctionWrapper)
            {
                func = (func as FunctionWrapper).InnerFunction;
            }

            function = (FileBasedFunction <FunctionType>)func;
        }