Sha256: 7ab395df5720f29d5206660429852fcedd7d44047300c4872ac93269fedf5ea0

Contents?: true

Size: 1.06 KB

Versions: 1

Compression:

Stored size: 1.06 KB

Contents

# frozen_string_literal: true

require 'version'

# Small and effective implementation of the observer pattern to define event methods on objects
module ObserveEvent
  is_versioned

  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

  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

  def event_accessor(name)
    attr_reader(name)
    event_writer(name)
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
observe_event-0.1.0 lib/observe_event.rb