MarkupBuilderで要素の定義を別で定義したい。

少しタイトルが変わってますが、MarkupBuilderで要素の作成を別メソッドにする方法がわからない。 - 旧山pの楽しいお勉強生活の続き。

前回、delegateを使用することでクロージャを外部に定義する方法がわかった。

import groovy.xml.MarkupBuilder

def xml = new MarkupBuilder()
def c = {n ->
  car{
    name(n)
  }
}
c.delegate = xml

xml.root(){
  id(1)
  user {
    name("yamada")
    c("car1")
  }
  company {
    name("kaisha")
    c("car2")
  }
}

これでクロージャを使いまわしていい感じにできる!っと思ったけど、実際に使ってみるとuserもcompanyも外で定義したい。
というか、root自体も定義しておきたいので定義してみる。

出力したい内容

<?xml version='1.0' encoding='UTF-8'?>
<root>
  <id>1</id>
  <user>
    <name>yamada</name>
    <car>
      <name>car1</name>
    </car>
  </user>
  <company>
    <name>kaisha</name>
    <car>
      <name>car2</name>
    </car>
  </company>
</root> 
import groovy.xml.MarkupBuilder
import groovy.xml.MarkupBuilderHelper

def c = {n ->
  car{
    name(n)
  }
}
def u = { n, cn ->
  user {
    name(n)
    c(cn)
  }
}
def com = { n, cn ->
    company {
      name(n)
      c(cn)
    }
}

def r = {
  root(){
    id(1)
    u("yamada","car1")
    com("kaisha", "car2")
  }
}

def xml = new MarkupBuilder()
new MarkupBuilderHelper(xml).xmlDeclaration(version:'1.0',encoding:'UTF-8')
[c,r,u,com].each{it.delegate = xml}
r()

確かにそれぞれで定義はできているし、使いまわせるけどdelegateを設定するのがカッコ悪い。
もう少しいい方法があると思うんだけど。。。