The closure for my StreamingMarkupBuilder is very large, so I would like to 
refactor it into smaller units. What is the recommended way to do this?
I came across 
https://slideguitarist.blogspot.com/2011/09/refactoring-groovy-to-generate-xml.html
 but hoping there is a more elegant way.

This is my sample:

def transactions = [ [ changeFlag: 'I', name:'Pete']
                   , [ changeFlag: 'U', name:'John']
                   ]
Closure c = {
    invoices {
        transactions.each { trx ->
            if (trx.changeFlag=='I') {
                line(type:'New'){
                    name(trx.name)
                }
            } else {
                line(type:'Update'){
                    name(trx.name)
                }
            }
        }
    }
}

def builder = new groovy.xml.StreamingMarkupBuilder()
def writable = builder.bind c
def result = writable.toString()
println result

And I would like to refactor this into something resembling:

def transactions = [ [ changeFlag: 'I', name:'Pete']
                   , [ changeFlag: 'U', name:'John']
                   ]
def xmlInsert (trx) {
    line(type:'New'){
        name(trx.name)
    }
}
def xmlUpdate (trx) {
    line(type:'Update'){
        name(trx.name)
    }
}

Closure c = {
    invoices {
        transactions.each { trx ->
            if (trx.changeFlag=='I') {
                xmlInsert trx
            } else {
                xmlUpdate trx
            }
        }
    }
}

def builder = new groovy.xml.StreamingMarkupBuilder()
def writable = builder.bind c
println writable.toString()

This code results in: groovy.lang.MissingMethodException: No signature of 
method: invoices() is applicable

Reply via email to