module ServiceBureau::Services
When mixed in to a class, it provides a handle for all configured services. It also provides an injector method for each service so that altenative implementations can be easily injected e.g. for testing.
@example
ServiceBureau::Locations.configure do |c| c.my_service MyService.public_method(:new) end Class MyClass include ServiceBureau::Services end obj = MyClass.new obj.my_service # => returns the result of: MyService.new obj.my_service = double('a fake service') obj.my_service # => returns the test double
Public Class Methods
included(base)
click to toggle source
# File lib/service_bureau/services.rb, line 23 def self.included(base) ServiceBureau::Locations.factory_map.keys.each do |service| # Provide a method to inject the service obj define_method "#{service}=" do |service_obj| __set_service__ service, service_obj end # Provide a handle to the service instance define_method service do |*args| __get_service__ service, *args end end end
Private Instance Methods
__get_service__(key, *args)
click to toggle source
# File lib/service_bureau/services.rb, line 43 def __get_service__(key, *args) memoized = instance_variable_get :"@__#{key}__" return memoized || begin __set_service__ key, ServiceBureau::Locator.new.get_service(key, *args) end end
__set_service__(key, service_obj)
click to toggle source
# File lib/service_bureau/services.rb, line 39 def __set_service__(key, service_obj) instance_variable_set :"@__#{key}__", service_obj end