Module: ConvenientService::Core::Concern::ClassMethods

Defined in:
lib/convenient_service/core/concern/class_methods.rb

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, **kwargs, &block) ⇒ void (private)

Note:

Config commitment via a missing class method is very common. Convenient Service Standard config does that by .new, .result and .step most of the time.

This method returns an undefined value.

Commits config. In other words, includes concerns into the mixing class. If method is still NOT defined, raises NoMethodError, otherwise - retries to call the method.

Parameters:

  • method (Symbol)
  • args (Array<Object>)
  • kwargs (Hash{Symbol => Object})
  • block (Proc, nil)


120
121
122
123
124
125
126
127
128
129
130
# File 'lib/convenient_service/core/concern/class_methods.rb', line 120

def method_missing(method, *args, **kwargs, &block)
  commit_config!(trigger: Constants::Triggers::CLASS_METHOD_MISSING)

  return ::ConvenientService.reraise { super } unless Utils::Module.class_method_defined?(self, method, public: true, protected: false, private: false)

  return ::ConvenientService.reraise { super } if middlewares(method, scope: :class).defined_without_super_method?

  ConvenientService.logger.debug { "[Core] Committed config for `#{self}` | Triggered by `method_missing` | Method: `.#{method}`" }

  __send__(method, *args, **kwargs, &block)
end

Instance Method Details

#commit_config!(trigger: ConvenientService::Core::Constants::Triggers::USER) ⇒ Boolean

Commits config when called for the first time. Does nothing for the subsequent calls.

Parameters:

Returns:

  • (Boolean)

    true if called for the first time, false otherwise (similarly as Kernel#require).

See Also:



49
50
51
52
# File 'lib/convenient_service/core/concern/class_methods.rb', line 49

def commit_config!(trigger: ConvenientService::Core::Constants::Triggers::USER)
  (@__convenient_service_config__ ||= Entities::Config.new(klass: self)).commit!(trigger: trigger)
    .tap { ConvenientService.logger.debug { "[Core] Committed config for `#{self}` | Triggered by `.commit_config!(trigger: #{trigger.inspect})` " } }
end

#concernsObject



14
15
16
# File 'lib/convenient_service/core/concern/class_methods.rb', line 14

def concerns(...)
  (@__convenient_service_config__ ||= Entities::Config.new(klass: self)).concerns(...)
end

#has_committed_config?Boolean

Returns true when config is committed, otherwise - false.

Returns:

  • (Boolean)

    Returns true when config is committed, otherwise - false.



32
33
34
# File 'lib/convenient_service/core/concern/class_methods.rb', line 32

def has_committed_config?
  (@__convenient_service_config__ ||= Entities::Config.new(klass: self)).committed?
end

#middlewaresObject



25
26
27
# File 'lib/convenient_service/core/concern/class_methods.rb', line 25

def middlewares(...)
  (@__convenient_service_config__ ||= Entities::Config.new(klass: self)).middlewares(...)
end

#new(*args, **kwargs, &block) ⇒ Object

Returns Can be any type.

Parameters:

  • args (Array<Object>)
  • kwargs (Hash{Symbol => Object})
  • block (Proc, nil)

Returns:

  • (Object)

    Can be any type.



65
66
67
# File 'lib/convenient_service/core/concern/class_methods.rb', line 65

def new(*args, **kwargs, &block)
  has_committed_config? ? super : method_missing(:new, *args, **kwargs, &block)
end