Sha256: 1a996574c469cb4f5daf1d70c804c4f84dc5cef775c0cee26252afbc21d99706

Contents?: true

Size: 1.49 KB

Versions: 2

Compression:

Stored size: 1.49 KB

Contents

module Toy
  class Attribute
    attr_reader :model, :name, :type, :options

    def initialize(model, name, type, options={})
      options.assert_valid_keys(:default, :embedded_list, :virtual, :abbr)

      @model, @name, @type, @options = model, name.to_s, type, options
      @virtual = options.fetch(:virtual, false)

      if abbr?
        options[:abbr] = abbr.to_s
        model.alias_attribute(abbr, name)
      end

      model.attributes[name.to_s] = self
    end

    def from_store(value)
      value = default if default? && value.nil?
      type.from_store(value, self)
    end

    def to_store(value)
      value = default if default? && value.nil?
      type.to_store(value, self)
    end

    def default
      if options.key?(:default)
        options[:default].respond_to?(:call) ? options[:default].call : options[:default]
      else
        type.respond_to?(:store_default) ? type.store_default : nil
      end
    end

    def default?
      options.key?(:default) || type.respond_to?(:store_default)
    end

    def virtual?
      @virtual
    end

    def persisted?
      !virtual?
    end

    def abbr?
      options.key?(:abbr)
    end

    def abbr
      options[:abbr]
    end

    def store_key
      abbr? ? abbr : name
    end

    # Stores reference to related embedded list
    def embedded_list
      options[:embedded_list]
    end

    def eql?(other)
      self.class.eql?(other.class) &&
        model == other.model &&
        name  == other.name
    end
    alias :== :eql?
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
toystore-0.6.6 lib/toy/attribute.rb
toystore-0.6.5 lib/toy/attribute.rb