module ObserveEvent

Small and effective implementation of the observer pattern to define event methods on objects

Public Instance Methods

event(name) click to toggle source
# File lib/observe_event.rb, line 9
def event(name)
  define_method(name) do |*arguments, &block| # TODO: Allow below, they get tacked onto the block arguments
    raise ArgumentError, 'Arguments cannot be passed with a block' if !block.nil? && !arguments.empty?

    events = instance_variable_get("@#{name}")

    return if block.nil? && events.nil?
    return events.each { |event| event.call(*arguments) } if block.nil?
    return instance_variable_set("@#{name}", [block]) if events.nil?

    events << block
  end
end
event_accessor(name) click to toggle source
# File lib/observe_event.rb, line 36
def event_accessor(name)
  attr_reader(name)
  event_writer(name)
end
event_writer(name) click to toggle source
# File lib/observe_event.rb, line 23
def event_writer(name)
  event("#{name}_changed")

  define_method("#{name}=") do |current_value|
    previous_value = instance_variable_get("@#{name}")

    instance_variable_set("@#{name}", current_value)
    send("#{name}_changed", previous_value, current_value)

    current_value
  end
end