- if (dynamic_cast<Request_chord const *> (m))
- p = new Request_chord_iterator;
- else if (dynamic_cast<Simultaneous_music const *> (m))
- p = new Simultaneous_music_iterator;
- else if (dynamic_cast<Sequential_music const *> (m))
- p = new Sequential_music_iterator;
- else if (dynamic_cast<Translation_property const *> (m))
- p = new Property_iterator;
- else if (dynamic_cast<Change_translator const *> (m))
- p = new Change_iterator;
- else if (dynamic_cast<Compressed_music const *> (m))
- p = new Compressed_music_iterator;
- else if (dynamic_cast<Music_wrapper const *> (m))
+
+ SCM ctor = m->get_mus_property ("iterator-ctor") ;
+ if (unsmob_cxx_function (ctor))
+ {
+ Cxx_function f = unsmob_cxx_function (ctor);
+
+ p = (Music_iterator*) (*f) (SCM_EOL);
+ }
+ else if (dynamic_cast<Music_wrapper *> (m))