+LoaderAction *Loader::find_action(const ActionKey &key) const
+{
+ ActionMap::const_iterator begin = actions.lower_bound(ActionKey(key.keyword, string()));
+ ActionMap::const_iterator end = actions.upper_bound(ActionKey(key.keyword, "~"));
+
+ if(begin==end)
+ throw KeyError("Unknown keyword", key.keyword);
+
+ for(ActionMap::const_iterator i=begin; i!=end; ++i)
+ if(signature_match(key.signature, i->first.signature))
+ return i->second;
+
+ throw KeyError(format("Keyword '%s' does not accept signature '%s'", key.keyword, key.signature));
+}
+
+
+Loader::ActionKey::ActionKey(const string &k, const string &s):
+ keyword(k),
+ signature(s)
+{ }
+
+bool Loader::ActionKey::operator<(const ActionKey &other) const