class Class

Private Instance Methods

attr_accessor(*args) click to toggle source
# File lib/better_attrs/class.rb, line 6
def attr_accessor(*args)
  attr_reader *extract_attrs_from_args(args)
  attr_writer *args
end
Also aliased as: original_attr_accessor
attr_writer(*args) click to toggle source
# File lib/better_attrs/class.rb, line 13
def attr_writer(*args)
  attrs = extract_attrs_from_args(args)
  opts = extract_opts_from_args(args)
  attrs.each { |attr| define_attr_writer(attr, opts) }
end
Also aliased as: original_attr_writer
callback_for_attr(attr, opts) click to toggle source
# File lib/better_attrs/class.rb, line 19
def callback_for_attr(attr, opts)
  opts[:"#{attr}_changed"] || opts[:"#{attr}_updated"]
end
define_attr_writer(attr, opts) click to toggle source
# File lib/better_attrs/class.rb, line 23
def define_attr_writer(attr, opts)
  class_eval do
    # Memoized state
    instance_variable = instance_variable_for_attr(attr)
    callback = callback_for_attr(attr, opts)
    writer_method = writer_method_for_attr(attr)

    define_method(writer_method) do |new_value|
      # Capture the `old_value`
      old_value = instance_variable_get(instance_variable)

      # Short-circuit if the values are the same
      return new_value if old_value == new_value

      # Update the instance-variable
      instance_variable_set(instance_variable, new_value)

      # Update the attributes `Hash` if it is present
      send(:[]=, attr, new_value) if defined?(::Rails) && respond_to?(:attributes)

      # Short-circuit if no callback was specified
      return new_value if callback.nil?

      # Callable object (e.g. `Proc`, `Lambda`)
      instance_exec(old_value, new_value, &callback) if callback.respond_to?(:call)

      # Method name (must be `String` or `Symbol`)
      send(callback, old_value, new_value) if [String, Symbol].include?(callback.class)
    end
  end
end
extract_attrs_from_args(args) click to toggle source
# File lib/better_attrs/class.rb, line 55
def extract_attrs_from_args(args)
  args.last.is_a?(Hash) ? args[0..-2] : args
end
extract_opts_from_args(args) click to toggle source
# File lib/better_attrs/class.rb, line 59
def extract_opts_from_args(args)
  args.last.is_a?(Hash) ? args.last : {}
end
instance_variable_for_attr(attr) click to toggle source
# File lib/better_attrs/class.rb, line 63
def instance_variable_for_attr(attr)
  :"@#{attr}"
end
original_attr_accessor(*args)
Alias for: attr_accessor
original_attr_writer(*args)
Alias for: attr_writer
writer_method_for_attr(attr) click to toggle source
# File lib/better_attrs/class.rb, line 67
def writer_method_for_attr(attr)
  :"#{attr}="
end