internal void IncludeLibraryModule(Action<RubyModule> instanceTrait, Action<RubyModule> classTrait, Action<RubyModule> constantsInitializer,
RubyModule/*!*/[]/*!*/ mixins, bool builtin) {
// Do not allow non-builtin library inclusions to a frozen module.
// We need to ensure that initializers are not modified once a module is frozen.
if (!builtin) {
Mutate();
}
using (Context.ClassHierarchyLocker()) {
if (instanceTrait != null) {
IncludeTraitNoLock(ref _methodsInitializer, _methodsState, instanceTrait);
}
if (constantsInitializer != null) {
IncludeTraitNoLock(ref _constantsInitializer, _constantsState, constantsInitializer);
}
if (classTrait != null) {
var singleton = GetOrCreateSingletonClass();
singleton.IncludeTraitNoLock(ref singleton._methodsInitializer, singleton._methodsState, classTrait);
}
// updates the module version:
IncludeModulesNoLock(mixins);
}
}