Class: Appear::BaseService

Inherits:
Object
  • Object
show all
Defined in:
lib/appear/service.rb

Overview

Dependency-injectable service class. Service will raise errors during initialization if its dependencies are not met.

Direct Known Subclasses

Service

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(given_services = {}) ⇒ BaseService

Returns a new instance of BaseService.



7
8
9
10
11
12
13
14
15
16
17
# File 'lib/appear/service.rb', line 7

def initialize(given_services = {})
  req_service_instances = {}
  self.class.required_services.each do |service|
    unless given_services[service]
      raise ArgumentError.new("required service #{service.inspect} not provided to instance of #{self.class.inspect}")
    end

    req_service_instances[service] = given_services[service]
  end
  @services = OpenStruct.new(req_service_instances)
end

Class Method Details

.delegate(method, service) ⇒ Object

Delegate a method to another service. Declares a dependency on that service.



21
22
23
24
25
26
27
28
29
# File 'lib/appear/service.rb', line 21

def self.delegate(method, service)
  require_service(service)
  self.send(:define_method, method) do |*args, &block|
    unless @services.send(service).respond_to?(method)
      raise NoMethodError.new("Would call private method #{method.inspect} on #{service.inspect}")
    end
    @services.send(service).send(method, *args, &block)
  end
end

.require_service(name) ⇒ Object

Declare a dependency on another service.



43
44
45
46
47
48
# File 'lib/appear/service.rb', line 43

def self.require_service(name)
  @required_services ||= []

  return if required_services.include?(name)
  @required_services << name
end

.required_servicesObject

List all the services required by this service class.



32
33
34
35
36
37
38
39
40
# File 'lib/appear/service.rb', line 32

def self.required_services
  @required_services ||= []

  if self.superclass.respond_to?(:required_services)
    @required_services + self.superclass.required_services
  else
    @required_services
  end
end