Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 214
module ShopifyCli::MethodObject
The MethodObject mixin can be included in any class that implements call
to ensure that
callwill always return aShopifyCli::Resultby prepending a module that takes care of the result wrapping and- a
to_procmethod that allows instances of this class to be passed as a block.
For convenience, this mixin also adds the corresponding class methods: call
and to_proc. Method and result objects pair nicely as they greatly simplify
the creation of complex processing chains:
class Serialize
include MethodObject
def call(attrs)
attrs.to_json
end
end
class Deserialize
include MethodObject
def call(json)
JSON.parse(json)
end
end
Serialize
.call(firstname: "John", lastname: "Doe")
.then(&Deserialize)
.map { |attrs| OpenStruct.new(attrs) }
.unwrap(nil)
While this example is contrived, it still illustrates some key advantages of this programming paradigm:
- chaining operations is as simple as repeatedly calling
thenormap, - method objects don't have to be manually instantiated but can be
constructed using the
&operator, - error handling is deferred until the result is unwrapped.
Please see the section for ShopifyCli::Result,
ShopifyCli::Result::Success, and ShopifyCli::Result::Failure for more
information on the API of result objects.
included(method_object_implementation)
is invoked when this mixin is included into a class. This results in
- including
SmartProperties, - prepending the result wrapping mechanism, and
- adding the class methods
.calland.to_proc.
see source
# File lib/shopify-cli/method_object.rb, line 90defself.included(method_object_implementation)method_object_implementation.prepend(AutoCreateResultObject)method_object_implementation.include(SmartProperties)method_object_implementation.extend(ClassMethods)endto_proc()
returns a proc that invokes call with all arguments it receives when called
itself.
see source
# File lib/shopify-cli/method_object.rb, line 100defto_procmethod(:call).to_procend