Sha256: dc4be1e721ee8f6c8c551ccfd16a8d5c03f862c997ebd50dbcabf75ea7209595

Contents?: true

Size: 1.31 KB

Versions: 1

Compression:

Stored size: 1.31 KB

Contents

module DataMapper
  
  class Callbacks
  
    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
      ]
      
    def initialize
      @callbacks = Hash.new do |h,k|
        raise 'Callback names must be Symbols' unless k.kind_of?(Symbol)
        h[k] = []
      end
    end
    
    alias ruby_method_missing method_missing
    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
    
    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
    
    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
  end
  
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
datamapper-0.1.1 lib/data_mapper/callbacks.rb