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)


123
124
125
126
127
128
129
130
131
132
133
# File 'lib/convenient_service/core/concern/class_methods.rb', line 123

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