Sha256: 08aba1f8cc6bfe54a85cc1be6d6b0ad24f02228e12446c2e491bbe81188cbfa0

Contents?: true

Size: 1.36 KB

Versions: 2

Compression:

Stored size: 1.36 KB

Contents

module MusicBrainz
  class BaseModel
    def self.inherited(klass)
      klass.send(:include, InstanceMethods)
      klass.send(:extend, ClassMethods)
    end

    module ClassMethods
      def field(name, type)
        fields[name] = type
        attr_reader name

        define_method("#{name}=") do |val|
          instance_variable_set("@#{name}", validate_type(val, type))
        end
      end

      def fields
        instance_variable_set(:@fields, {}) unless instance_variable_defined?(:@fields)
        instance_variable_get(:@fields)
      end

      def client
        MusicBrainz.client
      end
    end

    module InstanceMethods
      def initialize(params = {})
        params.each do |field, value|
          self.send(:"#{field}=", value)
        end
      end

      def client
        MusicBrainz.client
      end

    private

      def validate_type(val, type)
        if type == Integer
          val.to_i
        elsif type == Float
          val.to_f
        elsif type == String
          val.to_s
        elsif type == Date
          if val.nil? or val == ""
            val = "2030-12-31"
          elsif val.split("-").length == 1
            val << "-12-31"
          elsif val.split("-").length == 2
            val << "-31"
          end
          Date.new(*val.split(?-).map(&:to_i))
        else
          val
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
musicbrainz-0.7.3 lib/musicbrainz/models/base_model.rb
musicbrainz-0.7.2 lib/musicbrainz/models/base_model.rb