class ActiveType::VirtualAttributes::Builder

Public Class Methods

new(owner, mod) click to toggle source
# File lib/active_type/virtual_attributes.rb, line 49
def initialize(owner, mod)
  @owner = owner
  @module = mod
end

Public Instance Methods

build(name, type, options) click to toggle source
# File lib/active_type/virtual_attributes.rb, line 54
def build(name, type, options)
  validate_attribute_name!(name)
  options.assert_valid_keys(:default)
  add_virtual_column(name, type, options)
  build_reader(name)
  build_writer(name)
  build_dirty_tracking_methods(name)
end

Private Instance Methods

add_virtual_column(name, type, options) click to toggle source
# File lib/active_type/virtual_attributes.rb, line 65
def add_virtual_column(name, type, options)
  type_caster = TypeCaster.get(type)
  column = VirtualColumn.new(name, type_caster, options.slice(:default))
  @owner.virtual_columns_hash = @owner.virtual_columns_hash.merge(name.to_s => column)
end
build_dirty_tracking_methods(name) click to toggle source

Methods for compatibility with gems expecting the ActiveModel::Dirty API.

# File lib/active_type/virtual_attributes.rb, line 92
      def build_dirty_tracking_methods(name)
        return if name.to_s == 'attribute' # clashes with internal methods

        @module.module_eval <<-BODY, __FILE__, __LINE__ + 1
          def #{name}_was
            virtual_attributes_were["#{name}"]
          end
        BODY

        @module.module_eval <<-BODY, __FILE__, __LINE__ + 1
          def #{name}_changed?
            self.#{name} != virtual_attributes_were["#{name}"]
          end
        BODY

        @module.module_eval <<-BODY, __FILE__, __LINE__ + 1
          def #{name}_will_change!
            # no-op
          end
        BODY
      end
build_reader(name) click to toggle source
# File lib/active_type/virtual_attributes.rb, line 71
      def build_reader(name)
        @module.module_eval <<-BODY, __FILE__, __LINE__ + 1
          def #{name}
            read_virtual_attribute('#{name}')
          end

          def #{name}?
            read_virtual_attribute('#{name}').present?
          end
        BODY
      end
build_writer(name) click to toggle source
# File lib/active_type/virtual_attributes.rb, line 83
      def build_writer(name)
        @module.module_eval <<-BODY, __FILE__, __LINE__ + 1
          def #{name}=(value)
            write_virtual_attribute('#{name}', value)
          end
        BODY
      end
validate_attribute_name!(name) click to toggle source
# File lib/active_type/virtual_attributes.rb, line 114
def validate_attribute_name!(name)
  unless name.to_s =~ /\A[A-Za-z0-9_]*\z/
    raise InvalidAttributeNameError.new("'#{name}' is not a valid name for a virtual attribute")
  end
end