class Iprog::Base

Override ‘process_data`, `check_errors`, and other hooks to build reusable logic.
The core base class for command/service objects using the Template Method Pattern.

def self.call(*args, **kwargs)

def self.call(*args, **kwargs)
  if kwargs.any?
    new(**kwargs).call
  elsif args.length == 1 && args.first.is_a?(Hash)
    new(**args.first).call
  else
    raise ArgumentError, "❌ Expected keyword args or a single hash"
  end
end

def call

def call
  check_errors
  return self if errors?
  process_data
  send_result filtered_response
end

def check_errors

def check_errors
  nil
end

def errors?

def errors?
  !errors.nil?
end

def extract_and_initialize_instance_variables

def extract_and_initialize_instance_variables
  result_data.each do |key, value|
    instance_variable_set("@#{key}", value)
  end
end

def filtered_fields

def filtered_fields
  []
end

def filtered_response

def filtered_response
  filtered_fields.any? ? result_data.slice(*filtered_fields) : result_data
end

def initialize(**kwargs)

def initialize(**kwargs)
  @params = kwargs.transform_keys(&:to_sym)
  @data   = {}
  set_params_data
  set_static_data
  extract_and_initialize_instance_variables
end

def process_data

def process_data
  {}
end

def result_data

def result_data
  @data
end

def send_error(data)

def send_error(data)
  @errors = data || []
  self
end

def send_result(data)

def send_result(data)
  @result = data || []
  self
end

def set(key, value)

def set(key, value)
  result_data[key] = value
end

def set_params_data

def set_params_data
  {}
end

def set_static_data

def set_static_data
  {}
end

def success?

def success?
  errors.nil?
end