Sha256: 7c9f94fef2add8c01298632d8b8eebdca36821f5065a9e2765f5b01d95e5cb84

Contents?: true

Size: 1.56 KB

Versions: 1

Compression:

Stored size: 1.56 KB

Contents

module Dbuilder::Builder

  def self.extended(klass)
    validate_class_name klass.name
    construct_builder_hashes klass.name.gsub(/builder$/i, "")
  end

  def builder_default(key, value)
    klazz = class << self; self; end
    Thread.current["#{self.class_name}_builder_defaults"][key.to_sym] = value
    klazz.send(:define_method, "with_#{key}".to_sym) do |overridden_value|
      Thread.current["#{self.class_name}_builder_overrides"][key.to_sym] = overridden_value
      self
    end
  end

  def builder_defaults(*defaults)
    raise "bulder_defaults expects pair arguments example: builder_defaults key, value, key, value ..." unless defaults.size % 2 == 0
    defaults.each_slice 2 do |pie|
      builder_default pie[0], pie[1]
    end
  end

  def class_name
    name.gsub(/builder$/i, "")
  end

  def build
    defaults   = Thread.current["#{class_name}_builder_defaults"]
    overrides  = Thread.current["#{class_name}_builder_overrides"]
    properties = defaults.merge overrides
    obj        =\
      begin 
        Kernel.const_get class_name
      rescue
        Object.const_set class_name, Class.new
      end
    properties.each {|k,v| obj.send(:define_method, k.to_sym){v} }
    obj
  end

private

  def self.validate_class_name(name)
    unless name.end_with? "Builder"
      raise "The extending class must have 'Builder' at the end of the class name"
    end
  end

  def self.construct_builder_hashes(class_name)
    class_name
    Thread.current["#{class_name}_builder_defaults"]  = Hash.new
    Thread.current["#{class_name}_builder_overrides"] = Hash.new
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dbuilder-0.5.0 lib/dbuilder/builder.rb