module Lutaml::Model::Utils

def add_method_if_not_defined(klass, method_name, &block)

def add_method_if_not_defined(klass, method_name, &block)
  unless klass.method_defined?(method_name)
    klass.class_eval do
      define_method(method_name, &block)
    end
  end
end

def blank?(value)

def blank?(value)
  value.respond_to?(:empty?) ? value.empty? : !value
end

def camel_case(str)

Convert string to camel case
def camel_case(str)
  return "" if str.nil? || str.empty?
  str.split("/").map { |part| camelize_part(part) }.join("::")
end

def camelize_part(part)

def camelize_part(part)
  part.gsub(/(?:_|-|^)([a-z\d])/i) { $1.upcase }
end

def classify(str)

Convert string to class name
def classify(str)
  str = str.to_s.delete(".")
  str = str.sub(/^[a-z\d]*/) { |match| camel_case(match) || match }
  str.gsub("::", "/").gsub(%r{(?:_|-|(/))([a-z\d]*)}i) do
    word = Regexp.last_match(2)
    substituted = camel_case(word) || word
    Regexp.last_match(1) ? "::#{substituted}" : substituted
  end
end

def deep_dup(hash)

def deep_dup(hash)
  return hash if hash.nil?
  new_hash = {}
  hash.each do |key, value|
    new_hash[key] = if value.is_a?(Hash)
                      deep_dup(value)
                    elsif value.respond_to?(:deep_dup)
                      value.deep_dup
                    else
                      value.dup
                    end
  end
  new_hash
end

def present?(value)

def present?(value)
  !blank?(value)
end

def snake_case(str)

Convert string to snake case
def snake_case(str)
  str = str.to_s.tr(".", "_")
  return str unless /[A-Z-]|::/.match?(str)
  str.gsub("::", "/")
    .gsub(/([A-Z]+)(?=[A-Z][a-z])|([a-z\d])(?=[A-Z])/) { "#{$1 || $2}_" }
    .tr("-", "_")
    .downcase
end