Module: ServiceCall::ClassMethods

Defined in:
lib/service_call.rb

Instance Method Summary collapse

Instance Method Details

#attribute(name, default: nil) ⇒ Object



22
23
24
25
# File 'lib/service_call.rb', line 22

def attribute(name, default: nil)
  attr_reader name
  self.attributes = attributes.merge(name => { default: default })
end

#attributesObject



27
28
29
# File 'lib/service_call.rb', line 27

def attributes
  {}
end

#attributes=(value) ⇒ Object



31
32
33
34
35
36
37
38
# File 'lib/service_call.rb', line 31

def attributes=(value)
  singleton_class.class_eval do
    undef_method :attributes
    define_method :attributes do
      value || {}
    end
  end
end

#call(*args, **kwargs) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/service_call.rb', line 40

def call(*args, **kwargs)
  setters = kwargs.keys.select { |name| method_defined?(name) }
  init_kwargs = kwargs.select { |key, value| setters.include?(key) }
  call_kwargs = kwargs.select { |key, value| !setters.include?(key) }

  # Should work, but bugs will be bugs: https://bugs.ruby-lang.org/issues/11131
  # new(**init_kwargs).call(*args, **call_kwargs)

  service = new(**init_kwargs)
  args << call_kwargs unless call_kwargs.empty?
  service.call(*args)
end