Sha256: d0d8645fd9b49f171af8ae2ab16628f6ab5f0d75b30ea6fad82619025b20a688

Contents?: true

Size: 1.46 KB

Versions: 1

Compression:

Stored size: 1.46 KB

Contents

module Husky

  class Entity

    class << self

      def wrap(items)
        items.map { |item| build(item) }
      end

      def build(data = nil)
        instance = allocate
        instance.construct(data)
        instance
      end

      def attr_required(*args)
        @@required = []
        args.each do |arg|
          self.class_eval("def #{arg};@#{arg};end") unless respond_to? arg
          @@required << arg
        end
      end

    end

    attr_reader :data

    def construct(data)
      if data.nil?
        # do nothing
      elsif data.is_a? Hash
        data.each_pair do |key, value|
          instance_variable_set("@#{key}", value)

          (class << self; self; end).class_eval do
            attr_reader key.to_sym
          end
        end
      else
        @data = data
      end
    end

    def set_basic_attributes_from_hash(hash)
      hash.each_pair do |key, value|
        unless value.respond_to? :each
          instance_variable_set("@#{key}", value)
        end
      end

      hash.each_pair do |key, value|
        unless value.respond_to? :each
          self.class.send(:define_method, key) do
            instance_variable_get("@#{key}")
          end
        end
      end
    end

    def valid?
      @@required.all? { |attr| !self.send(attr).nil? }
    end

    def method_missing(method, *args, &block)
      raise "#{method} called on @data, but @data is nil." if data.nil?
      data.send(method, *args, &block)
    end

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
husky-0.5.14 lib/husky/entity.rb