Permalink
Browse files

rewrote ConfigParser as an original implementation using methodMissin…

…g/propertyMissing
  • Loading branch information...
1 parent 5885e93 commit 701759ddc6e5315bc47cb4fec2400919efdb4b85 @nobeans committed Apr 2, 2012
@@ -1,5 +1,8 @@
package src.main.groovy.org.jggug.javaonetokyo.bof.dsl
+/**
+ * NodeBuilderを使用した実装
+ */
class ConfigBuilder {
Properties build(Closure dsl) {
@@ -1,25 +1,40 @@
package src.main.groovy.org.jggug.javaonetokyo.bof.dsl
+/**
+ * methodMissingとpropertyMissingを使った自前実装
+ */
class ConfigParser {
+ private props
+ private stack
+
Properties parse(Closure dsl) {
- def root = new NodeBuilder().config(dsl)
- def props = new Properties()
- traverse(root.value(), props, [])
+ this.props = new Properties()
+ this.stack = []
+
+ // delegateを差し替えてmethodMissing/propertyMissingが
+ // ConfigParser自身のメソッドを呼び出すように細工する。
+ dsl.delegate = this
+
+ // クロージャを実行する。
+ dsl.call()
+
return props
}
- void traverse(nodes, props, stack) {
- nodes.each { node ->
- def newStack = stack + node.name()
- def value = node.value()
- if (value in List) {
- traverse(value, props, newStack)
- } else {
- def key = newStack.join(".")
- props[key] = value
+ def methodMissing(String name, args) {
+ def oldStack = stack
+ this.stack = stack + name
+ args.each { arg ->
+ if (arg in Closure) {
+ arg.call()
}
}
+ this.stack = oldStack
}
+ void propertyMissing(String name, value) {
+ def key = (stack + name).join(".")
+ props[key] = value
+ }
}
@@ -10,7 +10,7 @@ class ConfigBuilderSpec extends Specification {
builder = new ConfigBuilder()
}
- def "入れご構造でドット区切りが表現できる"() {
+ def "入れ子構造でドット区切りが表現できる"() {
setup:
def config = {
x {
@@ -28,7 +28,7 @@ class ConfigBuilderSpec extends Specification {
props.size() == 1
}
- def "入れご構造でドット区切りが表現できる。複数キーの場合"() {
+ def "入れ子構造でドット区切りが表現できる。複数キーの場合"() {
setup:
def config = {
x {
@@ -10,12 +10,12 @@ class ConfigParserSpec extends Specification {
parser = new ConfigParser()
}
- def "入れご構造でドット区切りが表現できる"() {
+ def "入れ子構造でドット区切りが表現できる"() {
setup:
def config = {
x {
y {
- z "value of z"
+ z = "value of z"
}
}
}
@@ -28,16 +28,16 @@ class ConfigParserSpec extends Specification {
props.size() == 1
}
- def "入れご構造でドット区切りが表現できる。複数キーの場合"() {
+ def "入れ子構造でドット区切りが表現できる。複数キーの場合"() {
setup:
def config = {
x {
- a "value of a"
+ a = "value of a"
y {
- b "value of b"
- z "value of z"
+ b = "value of b"
+ z = "value of z"
}
- c "value of c"
+ c = "value of c"
}
}

0 comments on commit 701759d

Please sign in to comment.