Sha256: ad7118927e91538bd3e0e757c47f6e235952090ae771259a642720ca8e80bb0b

Contents?: true

Size: 1.5 KB

Versions: 5

Compression:

Stored size: 1.5 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 persisted_name
      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

5 entries across 5 versions & 1 rubygems

Version Path
toystore-0.8.3 lib/toy/attribute.rb
toystore-0.8.2 lib/toy/attribute.rb
toystore-0.8.1 lib/toy/attribute.rb
toystore-0.8.0 lib/toy/attribute.rb
toystore-0.7.0 lib/toy/attribute.rb