ExpandoMetaClass and DSLs
Categories apply only within the use blocks, and their effect is fairly limited in scope. If we want the method injection to be effective throughout our application, we can use the ExpandoMetaClass instead of categories. Let’s use the ExpandoMetaClass to implement the DSL syntax we saw in the previous section:
CreatingDSLs/DSLUsingExpandoMetaClass.groovy | |
| Integer.metaClass{ |
| getDays = { -> |
| delegate |
| } |
| |
| getAgo = { -> |
| def date = Calendar.instance |
| date.add(Calendar.DAY_OF_MONTH, -delegate) |
| date |
| } |
| } |
| |
| Calendar.metaClass.at = { Map time -> |
| def hour = 0 |
| def minute = 0 |
| time.each {key, value -> |
| hour = key.toInteger() |
| minute = value.toInteger() |
| } |
| |
| delegate.set(Calendar.HOUR_OF_DAY, ... |
Get Programming Groovy 2 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.