+template<typename T>
+inline void Sequencer::register_action_type(const std::string &n)
+{
+ if(action_types.count(n))
+ throw Msp::key_error(n);
+
+ action_types[n] = new RegisteredActionType<T>;
+}
+
+template<typename T>
+Sequencer::RegisteredAction::DefLoaderFunc Sequencer::RegisteredActionType<T>::get_def_loader_func() const
+{
+ return &ActionDefLoader::action_def<T>;
+}
+
+template<typename T>
+Sequencer::RegisteredAction::LoaderFunc Sequencer::RegisteredActionType<T>::get_loader_func() const
+{
+ return &SegmentLoader::action<T>;
+}
+
+template<typename T>
+void Sequencer::ActionDefLoader::action_def()
+{
+ if(action)
+ throw std::runtime_error("Only one action per definition is allowed");
+
+ Msp::RefPtr<T> act = new T;
+ load_sub(*act, demo);
+ action = act;
+}
+
+template<typename T>
+void Sequencer::SegmentLoader::action()
+{
+ Msp::RefPtr<T> act = new T;
+ load_sub(*act, demo);
+ obj.add_action(*act, start_beat, end_beat);
+ obj.anonymous_actions.push_back(act.release());
+}
+
+} // namespace DemoScene
+} // namespace Msp
+