module Apostle::Mailer

Public Class Methods

new(method_name = nil, *args) click to toggle source
Calls superclass method
# File lib/apostle_rails/mailer.rb, line 10
def initialize(method_name = nil, *args)
  super()
  @_message = Apostle::Mail.new nil
  @_apostle_known_instance_vars = (self.instance_variables.dup || [])
  process(method_name, *args) if method_name
end

Public Instance Methods

mail(template, variables = {}, &block) click to toggle source
# File lib/apostle_rails/mailer.rb, line 22
def mail(template, variables = {}, &block)
  @_mail_was_called = true
  m = @_message
  m.template_id = template

  # Call all the procs (if any)
  class_default = self.class.default
  default_values = class_default.merge(class_default) do |k,v|
    v.respond_to?(:to_proc) ? instance_eval(&v) : v
  end

  # Handle defaults
  variables = variables.reverse_merge(default_values)

  # Set configure delivery behavior
  # TODO Enable config options such as perform_deliveries and raise_delivery_errors
  # wrap_delivery_behavior!(headers.delete(:delivery_method),headers.delete(:delivery_method_options))

  # Assign all attributes
  variables.each { |k, v| m.send("#{k}=", v) }

  # Assign all new instance vars as attributes
  all_instance_vars = self.instance_variables.dup
  @_apostle_known_instance_vars.push(:@_apostle_known_instance_vars)
  (
    all_instance_vars - @_apostle_known_instance_vars
  ).
  each do |attr|
    value = self.instance_variable_get(attr).as_json
    attr = attr.to_s.gsub('@', '')
    if m.respond_to?("#{attr}=")
      m.send("#{attr}=", value)
    else
      m.data[attr] = value
    end
  end

  m
end
process(method_name, *args) click to toggle source
# File lib/apostle_rails/mailer.rb, line 17
def process(method_name, *args)
  self.send(method_name, *args)
  @_message = ActionMailer::Base::NullMail.new unless @_mail_was_called
end