module Outbox class Message include MessageTypes register_message_type :email, Outbox::Messages::Email # Make a new message. Every message can be created using a hash, # block, or direct assignment. # # message = Message.new do # email do # subject 'Subject' # end # end # message = Message.new email: { subject: 'Subject' } # message = Message.new # message.email = Email.new subject: 'Subject' def initialize(message_type_values = nil, &block) if block_given? instance_eval(&block) else assign_message_type_values(message_type_values) unless message_type_values.nil? end end # Loops through each registered message type and sets the content body. def body(value) each_message_type do |message_type, message| next if message.nil? message.body = value end end alias :body= :body # Delivers all of the messages to the given 'audience'. An 'audience' object # can be a hash or an object that responds to the current message types. Only # the message types specified in the 'audience' object will be sent to. # # message.deliver email: 'hello@example.com', sms: '+15555555555' # audience = OpenStruct.new # audience.email = 'hello@example.com' # audience.sms = '+15555555555' # message.deliver(audience) def deliver(audience) audience = Outbox::Accessor.new(audience) each_message_type do |message_type, message| next if message.nil? recipient = audience[message_type] message.deliver(recipient) if recipient end end end end