Sha256: b11d3f614e0b7ee0c5df4f14e3429f13d78c4fad2d89d06ec66e8ba3696451dd

Contents?: true

Size: 1.24 KB

Versions: 2

Compression:

Stored size: 1.24 KB

Contents

require 'gorillib'

class DslObject

  class_attribute :properties
  self.properties = {}

  def self.property(name, opts={})
    unless method_defined? name
      define_method(name) do |val=nil|
        set(name, val) unless val.nil?
        get(name)
      end
      self.properties[name.to_sym] = opts[:default] || nil
    end
  end

  def initialize(attrs={})
    define_properties!(attrs)
    impose_defaults!
    self
  end

  def configure(attrs={}, &block)
    define_properties!(attrs)
    instance_eval(&block) if block
    self
  end

  def set(property, val)
    instance_variable_set("@" + property.to_s, val)
  end
  
  def get(property)
    instance_variable_get("@" + property.to_s)
  end

  def set?(property)
    instance_variable_defined?("@" + property.to_s)
  end

  def unset!(property)
    remove_instance_variable("@" + property.to_s) if set?(property)
  end

  def to_hash
    self.properties.inject({}){ |hsh,(key,val)| hsh[key] = get(key) ; hsh }
  end

  def to_s
    "<#{self.class} #{to_hash.inspect}>"
  end
  
  private

  def impose_defaults!
    self.class.properties.each{ |key, val| set(key, val) unless set?(key) }
  end

  def define_properties!(hsh)
    hsh.each{ |name,val| self.class.property(name); set(name, val) }
  end

end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
gorillib-0.1.11 lib/gorillib/dsl_object.rb
gorillib-0.1.9 lib/gorillib/dsl_object.rb