class EventSourcing::Command

Public Class Methods

define(*fields, &block) click to toggle source
# File lib/event_sourcing/command.rb, line 5
def self.define(*fields, &block)
  raise "Commands require an execution block" unless block_given?

  Class.new(self) do
    public_class_method :new
    attr_reader(*fields)

    define_method :initialize do |properties = {}|
      missing_keys = fields - properties.keys
      
      if missing_keys.any?
        raise ArgumentError, "missing keyword: #{missing_keys.first}"
      end

      fields.each do |field|
        instance_variable_set("@#{field}", properties[field])
      end
    end

    define_method :execute do |*args|
      instance_exec(*args, &block)
    end
  end
end