/// <summary>
/// Installs the plugin.
/// </summary>
public void Install()
{
var types = _assembly.GetTypes();
var elements = _context.Elements;
foreach (var type in types)
{
if (!type.IsAbstract)
{
if (type.Name.EndsWith("Value", StringComparison.Ordinal))
{
var value = Instantiate <IRegisterElement>(elements, type);
value.RegisterElement(elements);
_valueTypes.Add(type.Name.RemoveValueConvention());
}
else
{
var interfaces = type.GetInterfaces();
var element = Instantiate <IRegisterElement>(elements, type, interfaces);
if (element != null)
{
element.RegisterElement(elements);
}
var function = Instantiate <IFunction>(elements, type, interfaces);
if (function != null)
{
bool isNested;
var name = FunctionName(type, out isNested);
_functions.Add(name);
_context.AddFunction(name, function);
}
var constant = Instantiate <IConstants>(elements, type, interfaces);
if (constant != null)
{
var name = constant.Name;
_constants.Add(name);
_context.AddConstant(name, constant);
}
var loader = Instantiate <IFunctionLoader>(elements, type, interfaces);
if (loader != null)
{
_loaders.Add(loader);
}
}
}
}
}