mopping up with groovy
DESCRIPTION
An introduction to using the Meta Object Protocol within GroovyTRANSCRIPT
Mopping Up With Groovy*
Brent [email protected] *obligatory lame pun
What is a MOP?
Duck Typing
• POJ (Plain Old Java) – you can interact with an object based on what it is (Class)
• Groovy – you can interact based on which properties and methods are available on the object (MetaClass)
Modifying Class Behaviour at Runtime
• AKA Monkey Patching
• AKA Duck Punching
• see whytheluckystiff's My Complete List Of Substitute Names For The Maneuver We Now Know To Be Monkeypatching
Why Do It?
• it has an amusing name
• it makes you more attractive to the opposite (or same) sex
• it allows you to write more succinct, expressive code
But I Feel Dirty …
• you may need to change how you think about things
• the laws are different in the duck typing universe
• question old attitudes and conventions
How Does Groovy Implement a MOP?
The MetaClass
• every Groovy object has one
• richer introspection and invocation interface than Java Class
• you can set the MetaClass for an object to change the rules for how it can behave
The Final Shape of an Object
Added Methods + Properties+ = MetaClassClass
The ExpandoMetaClass
• core of Groovy metaprogramming
• allows you to customise behaviour on the fly
• when you ask a newly created GroovyObject for its metaClass, this is what you get back
ExpandoMetaClass<<interface>>MetaClassGroovyObject
What Can You Do With It?
• borrow methods from other classes
• add or override constructors
• dynamically create method names
• add methods to interfaces
• add or override instance methods
• add or override properties
• add or override static methods
http://groovy.codehaus.org/ExpandoMetaClass
Adding a Class Method
Adding a Property
Overriding an Instance Method
The Same In Ruby
Invocation/Access Hooks
• invokeMethod
• getProperty
• setProperty
• propertyMissing
• methodMissing
AOP with invokeMethod
Flexible Methods with methodMissing
MOP!!...huh! What is it Good For?
Syntactic Sugar
Mocking/Stubbing Behaviour
DSL - The Original Class
Adding Some MOP Trickery
Icecream Time
Replacing/Simplifying Frameworks and Patterns
• Spring, EasyMock/JMock
• circumvent the rigidity of the Java language
• patterns like Builder
• Dependency Injection
• with Groovy these can be simplified or disappear altogether
Finally
The Pros and Cons
Pros
• flexibility
• extensibility
• power
Cons• sometimes clunky
syntax• slower performance
With Great Power…
• don’t get wowed by the coolness factor
• remember to KISS
• the end result should be more understandable, not less
• keep pushing the boundaries but exercise judgment
Further Reading and References
• http://www.gnu.org/software/guile/docs/goops/Metaobjects-and-the-Metaobject-Protocol.html#Metaobjects%20and%20the%20Metaobject%20Protocol
• http://en.wikipedia.org/wiki/Meta-object_protocol• http://www.grails-exchange.com/files/GraemeRocher%20-
%20Keynote-DynamicGroovyMetaMagic.pdf• http://groovy.codehaus.org/ExpandoMetaClass• http://whytheluckystiff.net/articles/
seeingMetaclassesClearly.html• http://groovy.codehaus.org/ExpandoMetaClass• http://hackety.org/2007/08/10/
myCompleteListOfSubstitutePhrasesForTheActWeNowKnowToBeMonkeypatching.html
• Groovy In Action