Sha256: 1a79e091decb7ffc5a6610cdbd0b62c80dacf9499b8312e02c5fa1cd5248b6cb

Contents?: true

Size: 1.23 KB

Versions: 1

Compression:

Stored size: 1.23 KB

Contents

require "mighty_struct/version"

class MightyStruct
  def self.define_property_accessors!(mighty_struct, object)
    if object.is_a?(Hash)
      object.keys.each do |_key|
        class_eval <<-EORUBY, __FILE__, __LINE__ + 1
          def #{_key}
            value = @object[#{_key.is_a?(Symbol) ? ':' << _key.to_s : '"' << _key << '"'}]
            self.class.new?(value) ? self.class.new(value) : value
          end
        EORUBY
      end
    end
  end

  def self.new?(object)
    object.is_a?(Array) || object.is_a?(Hash)
  end

  def initialize(object)
    unless self.class.new?(object)
      raise ArgumentError.new("Cannot create a an instance of #{self.class} for the given object!")
    end

    self.class.define_property_accessors!(self, @object = object)
  end

  #
  # last line of defense
  #
  def method_missing(method_name, *arguments, &block)
    if @object.respond_to?(method_name)
      result = @object.send(method_name, *arguments, &block)

      # ensure that results of called methods are mighty structs again
      self.class.new?(result) ? self.class.new(result) : result
    else
      super
    end
  end

  def respond_to_missing?(method_name, include_private = false)
    @object.respond_to?(method_name) || super
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mighty_struct-0.1.2 lib/mighty_struct.rb