public static RubyModule/*!*/ Include(
CallSiteStorage<Func<CallSite, RubyModule, RubyModule, object>>/*!*/ appendFeaturesStorage,
CallSiteStorage<Func<CallSite, RubyModule, RubyModule, object>>/*!*/ includedStorage,
RubyModule/*!*/ self, [NotNullItems]params RubyModule/*!*/[]/*!*/ modules) {
RubyUtils.RequireMixins(self, modules);
var appendFeatures = appendFeaturesStorage.GetCallSite("append_features", 1);
var included = includedStorage.GetCallSite("included", 1);
// Kernel#append_features inserts the module at the beginning of ancestors list;
// ancestors after include: [modules[0], modules[1], ..., modules[N-1], self, ...]
for (int i = modules.Length - 1; i >= 0; i--) {
appendFeatures.Target(appendFeatures, modules[i], self);
included.Target(included, modules[i], self);
}
return self;
}