Module: Conversion::Accessors::ClassMethods

Defined in:
lib/conversion/accessors.rb

Overview

This module is included in classes that includes Conversion::Accessors

Constant Summary collapse

@@attribute_conversion_mode =
nil

Instance Method Summary collapse

Instance Method Details

#attr_accessor(*args) ⇒ Object

Defines readers and setters for each symbol argument.

Option keys may contain :store_as and :store_mode, which are used as the target argument and :mode option of the Conversion.converter method.

class A
  include Conversion::Accessors
  attr_accessor :attr1, :store_as => Integer
  attr_accessor :attr2, :store_as => Integer, :store_mode => :strong_type_checking
end
a = A.new
a.attr1 = '1' # stores 1 in a.attr1
a.attr2 = '1' # raises ArgumentError


48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/conversion/accessors.rb', line 48

def attr_accessor(*args)
  options = args.last.is_a?(Hash) ? args.pop : {}
  accessor_options = ACCESSOR_OPTIONS.inject({}) { |h, accessor_option|
    option_value = options[accessor_option]
    h[accessor_option] = option_value if option_value
    h
  }
  unless accessor_options.empty?
    attr_reader(*args)
    args.each { |symbol| attr_writer(symbol, accessor_options) }
  else
    attr_accessor_before_conversion(*args)
  end
  nil
end

#attr_writer(*args) ⇒ Object

Defines setters for each symbol argument.

Option keys may contain :store_as and :store_mode, which are used as the target argument and :mode option of the Conversion.converter method.

class A
  include Conversion::Accessors
  attr_writer :attr1, :store_as => Integer
  attr_writer :attr2, :store_as => Integer, :store_mode => :strong_type_checking
end
a = A.new
a.attr1 = '1' # stores 1 in a.attr1
a.attr2 = '1' # raises ArgumentError


76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/conversion/accessors.rb', line 76

def attr_writer(*args)
  options = args.last.is_a?(Hash) ? args.pop : {}
  if options
    target = options[:store_as]
    mode = options[:store_mode] || @@attribute_conversion_mode
    converter = if @@convert_enumerable_attributes
                  Conversion.entries_converter(target, :mode=>mode)
                else
                  Conversion.converter(target, :mode=>mode)
                end
    if converter
      args.each { |symbol|
        define_method("#{symbol}=") { |*value|
          instance_variable_set("@#{symbol}", converter.call(*value))
        }
      }
      return nil
    end
  end
  attr_writer_before_conversion(*args)
  nil
end

#store_attributes_with_mode(mode) ⇒ Object

Specifies the default storage mode for attributes defined after this method is called

class A
  include Conversion::Accessors
  attr_accessor :attr1, :store_as => Integer

  store_attributes_with_mode :weak
  attr_accessor :attr2, :store_as => Integer
end
a = A.new
a.attr1 = 'abc' # raises
a.attr2 = 'abc' # stores 'abc' in a.attr2


131
132
133
# File 'lib/conversion/accessors.rb', line 131

def store_attributes_with_mode(mode)
  @@attribute_conversion_mode = mode
end

#store_enumerable_attributes(bool = true) ⇒ Object

Specifies whether entries should be converted when an enumerable is stored in an attribute

class A
  include Conversion::Accessors
  attr_accessor :attr1, :store_as => Integer

  store_enumerable_attributes
  attr_accessor :attr2, :store_as => Integer

  store_enumerable_attributes false
  attr_accessor :attr3, :store_as => Integer
end
a = A.new
a.attr1 = ['1'] # raises
a.attr2 = ['1'] # stores [1] in a.attr2
a.attr3 = ['1'] # raises


115
116
117
# File 'lib/conversion/accessors.rb', line 115

def store_enumerable_attributes(bool=true)
  @@convert_enumerable_attributes = bool
end