Module: YiffSpace::Concerns::AttributeMethods::ClassMethods

Defined in:
lib/yiffspace/concerns/attribute_methods.rb

Instance Method Summary collapse

Instance Method Details

#array_attribute(name, parse: /[^[:space:]]+/, join_character: " ", cast: :itself) ⇒ Object

Defines <attribute>_string, <attribute>_string=, and <attribute>= methods for converting an array attribute to or from a string.

The <attribute>= setter parses strings into an array using the parse regex. The resulting strings can be converted to another type with the cast option.



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/yiffspace/concerns/attribute_methods.rb', line 15

def array_attribute(name, parse: /[^[:space:]]+/, join_character: " ", cast: :itself)
  define_method("#{name}_string") do
    send(name).join(join_character)
  end

  define_method("#{name}_string=") do |value|
    raise(ArgumentError, "#{name} must be a String") unless value.respond_to?(:to_str)

    send("#{name}=", value)
  end

  define_method("#{name}=") do |value|
    if value.respond_to?(:to_str)
      super(value.to_str.scan(parse).flatten.map(&cast))
    elsif value.respond_to?(:to_a)
      super(value.to_a)
    else
      raise(ArgumentError, "#{name} must be a String or an Array")
    end
  end
end