private void AddMethod(MethodInfo method)
        {
            IEnumerable <RegexCommandAttribute> attributes = method.GetCustomAttributes <RegexCommandAttribute>();

            if (!attributes.Any())
            {
                _log.LogWarning("Cannot initialize Regex command from {TypeName}'s method {MethodName} - {Attribute} missing", method.DeclaringType.FullName, method.Name, nameof(RegexCommandAttribute));
                return;
            }
            foreach (RegexCommandAttribute attribute in attributes)
            {
                Commands.Add(RegexCommandInstance.Build(method, attribute, _serviceProvider));
            }
        }
        public object GetModuleInstance(RegexCommandInstance commandInstance)
        {
            // init module info
            RegexCommandModuleInfo moduleInfo;

            if (!_knownModules.TryGetValue(commandInstance, out moduleInfo))
            {
                IEnumerable <ConstructorInfo> constructors = commandInstance.ModuleType
                                                             .GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
                                                             .OrderByDescending(ctor => ctor.GetParameters().Length);
                foreach (ConstructorInfo ctor in constructors)
                {
                    moduleInfo = InitializeModuleInfo(ctor);
                    if (moduleInfo != null)
                    {
                        _knownModules.Add(commandInstance, moduleInfo);
                        break;
                    }
                }
                if (moduleInfo == null)
                {
                    throw new InvalidOperationException($"Cannot create {commandInstance.ModuleType.FullName} - none of the constructors can have its dependencies resolved");
                }
            }

            // check if there is already a persistent or shared instance
            if (_persistentInstances.TryGetValue(commandInstance, out object instance))
            {
                return(instance);
            }
            if (_sharedInstances.TryGetValue(moduleInfo.Type, out instance))
            {
                _persistentInstances.Add(commandInstance, instance);
                return(instance);
            }

            // create a new instance, cache it if it's persistent
            instance = moduleInfo.CreateInstance();
            if (moduleInfo.IsPersistent)
            {
                _persistentInstances.Add(commandInstance, instance);
                if (moduleInfo.IsShared)
                {
                    _sharedInstances.Add(moduleInfo.Type, instance);
                }
            }

            return(instance);
        }