module ClearObject

Constants

Attribute
VERSION

Public Instance Methods

clear(*attributes, default: nil, **opts, &block) click to toggle source
# File lib/clear_object.rb, line 9
def clear(*attributes, default: nil, **opts, &block)
  attributes.each do |c_attr|
    attr_reader c_attr

    if block_given?
      klass = Class.new do
        extend ClearObject
        class_eval(&block)
      end
      # How come this is working?
      Object.const_set((opts[:clear_name] || c_attr).to_s.capitalize, klass)
    end
    clear_attributes << Attribute.new(name: c_attr, default: default)
  end

  class_eval(custom_initialize_def)
end
clear_get_default_for(name) click to toggle source
# File lib/clear_object.rb, line 27
def clear_get_default_for(name)
  value = clear_attributes.detect { |c_attr| c_attr.name == name }.default
  if value.respond_to?(:call)
    value.call
  else
    value
  end
end

Private Instance Methods

clear_attributes() click to toggle source
# File lib/clear_object.rb, line 37
def clear_attributes
  @clear_attributes ||= AttributeSet.new
end
custom_initialize_def() click to toggle source
# File lib/clear_object.rb, line 41
def custom_initialize_def
  initialize_def = clear_attributes.map do |c_attr|
    if c_attr.default
      "#{c_attr.name}: self.class.clear_get_default_for(:#{c_attr.name})"
    else
      "#{c_attr.name}:"
    end
  end.join(', ')

  initialize_body = ''.tap do |init_body|
    clear_attributes.each do |c_attr|
      init_body << "@#{c_attr.name} = #{c_attr.name}\n"
    end
  end

  %Q{
    def initialize(#{initialize_def})
      #{initialize_body}
    end
  }
  end