Skip to content

Instantly share code, notes, and snippets.

@mariogarcia
Created May 31, 2017 19:08
Show Gist options
  • Save mariogarcia/ece9901caccd1723db3165e100e8c755 to your computer and use it in GitHub Desktop.
Save mariogarcia/ece9901caccd1723db3165e100e8c755 to your computer and use it in GitHub Desktop.
import groovy.transform.*
@ToString
class Vehicle {
String brand
String model
Integer wheels
}
class Car extends Vehicle {}
class Bike extends Vehicle {}
// FactoryBuilderSupport
class VehicleBuilder extends BuilderSupport {
@Override protected Object createNode(Object name, Map attributes = [:]) {
return createNode(name, attributes, null)
}
@Override protected Object createNode(Object name, Map attributes = [:], Object value) {
switch(name) {
case 'car': return new Car()
case 'bike': return new Bike()
case 'wheels':
assert value instanceof Integer
return ['wheels', value]
case 'brand':
assert value instanceof String
return ['brand', value]
case 'model':
assert value instanceof String
return ['model', value]
default:
throw new IllegalStateException("What type of vehicle are you trying to build ? $name ?")
}
}
@Override protected void setParent(Object parent, Object child) {
assert child instanceof List
assert child.size() == 2
switch(child.first()) {
case 'wheels':
parent.wheels = child.last()
break
case 'brand':
parent.brand = child.last()
break
case 'model':
parent.model = child.last()
break
}
}
static main(def args) {
println VehicleBuilder.newInstance().car {
wheels 4
brand 'ferrari'
model 'F450'
}
}
}
VehicleBuilder.main(null)
import groovy.transform.*
@ToString
class Vehicle {
String brand
String model
Integer wheels
}
class Car extends Vehicle {}
class Bike extends Vehicle {}
// FactoryBuilderSupport
class VehicleBuilder extends BuilderSupport {
@Override protected Object createNode(Object name, Map attributes = [:]) {
return createNode(name, attributes, null)
}
@Override protected Object createNode(Object name, Map attributes = [:], Object value) {
switch(name) {
case 'car': return new Car()
case 'bike': return new Bike()
case 'wheels':
assert value instanceof Integer
return ['wheels', value]
case 'brand':
assert value instanceof String
return ['brand', value]
case 'model':
assert value instanceof String
return ['model', value]
default:
throw new IllegalStateException("What type of vehicle are you trying to build ? $name ?")
}
}
@Override protected void setParent(Object parent, Object child) {
assert child instanceof List
assert child.size() == 2
switch(child.first()) {
case 'wheels':
parent.wheels = child.last()
break
case 'brand':
parent.brand = child.last()
break
case 'model':
parent.model = child.last()
break
}
}
static main(def args) {
println VehicleBuilder.newInstance().car {
wheels 4
brand 'ferrari'
model 'F450'
}
}
}
VehicleBuilder.main(null)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment