Class: DataMapper::Callbacks

Inherits:
Object
  • Object
show all
Defined in:
lib/data_mapper/callbacks.rb

Constant Summary collapse

EVENTS =
[
:before_materialize, :after_materialize,
:before_save, :after_save,
:before_create, :after_create,
:before_update, :after_update,
:before_destroy, :after_destroy,
:before_validate, :after_validate
]

Instance Method Summary collapse

Constructor Details

#initializeCallbacks

Returns a new instance of Callbacks.



14
15
16
17
18
19
# File 'lib/data_mapper/callbacks.rb', line 14

def initialize
  @callbacks = Hash.new do |h,k|
    raise 'Callback names must be Symbols' unless k.kind_of?(Symbol)
    h[k] = []
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(sym, *args) ⇒ Object



22
23
24
25
26
27
28
29
30
31
# File 'lib/data_mapper/callbacks.rb', line 22

def method_missing(sym, *args)
  if EVENTS.include?(sym)
    self.class.send(:define_method, sym) { @callbacks[sym] }
    return send(sym)
  elsif sym.to_s =~ /^execute_(\w+)/ && EVENTS.include?($1.to_sym)
    return execute(args.first, $1.to_sym)
  end
  
  super
end

Instance Method Details

#add(name, string = nil, &block) ⇒ Object

Raises:

  • (ArgumentError)


43
44
45
46
47
# File 'lib/data_mapper/callbacks.rb', line 43

def add(name, string = nil, &block)
  callback = send(name)
  raise ArgumentError.new("You didn't specify a callback in either string or block form.") if string.nil? && block.nil?
  callback << (string.nil? ? block : string)
end

#execute(name, instance) ⇒ Object



33
34
35
36
37
38
39
40
41
# File 'lib/data_mapper/callbacks.rb', line 33

def execute(name, instance)
  @callbacks[name].each do |callback|
    if callback.kind_of?(String)
      instance.instance_eval(callback)
    else
      instance.instance_eval(&callback)
    end
  end
end

#ruby_method_missingObject



21
# File 'lib/data_mapper/callbacks.rb', line 21

alias ruby_method_missing method_missing