+ }
+
+ add_plugins(unordered_plugins);
+}
+
+void Builder::add_plugins(vector<LoadedPlugin> &unordered_plugins)
+{
+ auto have_plugin = [this](const string &r){
+ return any_of(plugins.begin(), plugins.end(), [&r](const LoadedPlugin &p){ return FS::basepart(FS::basename(p.path))==r; });
+ };
+
+ while(!unordered_plugins.empty())
+ {
+ bool any_added = false;
+ for(auto i=unordered_plugins.begin(); i!=unordered_plugins.end(); )
+ {
+ const vector<string> &required = i->plugin->get_required_plugins();
+ if(all_of(required.begin(), required.end(), have_plugin))
+ {
+ plugins.push_back(move(*i));
+ i = unordered_plugins.erase(i);
+ any_added = true;
+ }
+ else
+ ++i;
+ }