Created
May 31, 2017 19:08
-
-
Save mariogarcia/ece9901caccd1723db3165e100e8c755 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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