+void ProgramCompiler::BlockModifier::flatten_block(Block &block)
+{
+ for(list<NodePtr<Node> >::iterator i=block.body.begin(); i!=block.body.end(); ++i)
+ insert_nodes.push_back((*i)->clone());
+ remove_node = true;
+}
+
+void ProgramCompiler::BlockModifier::apply_and_increment(Block &block, list<NodePtr<Node> >::iterator &i)
+{
+ for(list<Node *>::iterator j=insert_nodes.begin(); j!=insert_nodes.end(); ++j)
+ block.body.insert(i, *j);
+ insert_nodes.clear();
+
+ if(remove_node)
+ block.body.erase(i++);
+ else
+ ++i;
+ remove_node = false;
+}
+
+void ProgramCompiler::BlockModifier::visit(Block &block)
+{
+ for(list<NodePtr<Node> >::iterator i=block.body.begin(); i!=block.body.end(); )
+ {
+ (*i)->visit(*this);
+ apply_and_increment(block, i);
+ }
+}
+
+
+ProgramCompiler::InterfaceGenerator::InterfaceGenerator():
+ scope_level(0)
+{ }
+