class WolfCore::DomainObject

def self.cast(object)

def self.cast(object)
  if object.is_a?(self)
    object
  else
    result = self.create(object)
    success_key = extract_success_key
    result.success? ? result.data.send(success_key) : object
  end
end

def self.cast_all(objects)

def self.cast_all(objects)
  objects.map { |object| cast(object) }
end

def self.create(params = {}, **kwargs)

def self.create(params = {}, **kwargs)
  object = self.new(parse_params(params, **kwargs))
  object.reset_changes
  if object.valid?
    success_key = extract_success_key
    Result.success(data: { success_key => object })
  else
    Result.failure(error: { message: object.errors.full_messages.to_sentence })
  end
rescue ActiveModel::UnknownAttributeError => e
  Result.failure(error: { message: e.message, error_type: e.class.to_s })
end

def self.create_all(objects)

def self.create_all(objects)
  success_key = extract_success_key
  final_array = []
  objects.each do |object|
    result = create(object)
    if result.failure?
      return result
    else
      final_array << result.data[success_key.to_sym]
    end
  end
  Result.success(data: { success_key.pluralize.to_s => final_array })
end

def self.define_attributes(*attributes)

def self.define_attributes(*attributes)
  self.fields += attributes
  attr_accessor(*attributes)
  define_attribute_methods(*attributes)
  attributes.each do |attribute|
    define_method(:"#{attribute}=") do |value|
      send(:"#{attribute}_will_change!") unless value == send(attribute)
      run_callbacks :attribute_change do
        instance_variable_set(:"@#{attribute}", value)
      end
      value
    end
  end
end

def self.extract_success_key

def self.extract_success_key
  self.to_s.split('::').last.underscore
end

def self.parse_params(params = {}, **kwargs)

def self.parse_params(params = {}, **kwargs)
  params = {} unless params.is_a?(Hash)
  params = params.merge(kwargs)
  (params.to_h).with_indifferent_access
end

def attributes

def attributes
  instance_values.slice(*self.class.fields.map(&:to_s)).with_indifferent_access
end

def attributes=(attrs)

def attributes=(attrs)
  run_callbacks :attribute_change do
    super
  end
end

def initialize(attributes = {})

def initialize(attributes = {})
  run_callbacks :initialize do
    super
  end
end

def parse_attributes; end

def parse_attributes; end

def reset_changes

def reset_changes
  self.changes_applied
end

def valid?(*args)

def valid?(*args)
  run_callbacks(:validation) do
    super
  end
  errors.empty?
end