Module: AMA::Entity::Mapper::Mixin::HandlerSupport

Included in:
Type, Type::Attribute
Defined in:
lib/ama-entity-mapper/mixin/handler_support.rb

Overview

This module provides Type and Attribute classes with shortcut handler :name, :method method to register handlers

Class Method Summary collapse

Class Method Details

.declare_handler_block_setter(klass, handler_key, method) ⇒ Object



56
57
58
59
60
61
62
63
# File 'lib/ama-entity-mapper/mixin/handler_support.rb', line 56

def declare_handler_block_setter(klass, handler_key, method)
  klass.instance_eval do
    include Mixin::Reflection
    define_method("#{handler_key}_block") do |&block|
      send("#{handler_key}=", method_object(method, &block))
    end
  end
end

.declare_handler_getter(klass, handler_key, handler_class) ⇒ Object



35
36
37
38
39
40
41
42
# File 'lib/ama-entity-mapper/mixin/handler_support.rb', line 35

def declare_handler_getter(klass, handler_key, handler_class)
  instance = handler_class::INSTANCE
  klass.instance_eval do
    define_method(handler_key) do
      instance_variable_get("@#{handler_key}") || instance
    end
  end
end

.declare_handler_method(klass) ⇒ Object



24
25
26
27
28
29
30
31
32
33
# File 'lib/ama-entity-mapper/mixin/handler_support.rb', line 24

def declare_handler_method(klass)
  processor = self
  klass.define_singleton_method(:handler) do |key, method|
    handler_name = key.capitalize
    handler_class = @handler_namespace.const_get(handler_name)
    processor.declare_handler_getter(klass, key, handler_class)
    processor.declare_handler_setter(klass, key, handler_class)
    processor.declare_handler_block_setter(klass, key, method)
  end
end

.declare_handler_setter(klass, handler_key, handler_class) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
# File 'lib/ama-entity-mapper/mixin/handler_support.rb', line 44

def declare_handler_setter(klass, handler_key, handler_class)
  klass.instance_eval do
    define_method("#{handler_key}=") do |handler|
      unless handler.class == handler_class
        handler = handler_class.wrap(handler)
      end
      instance_variable_set("@#{handler_key}", handler)
      self
    end
  end
end

.declare_namespace_method(klass) ⇒ Object



18
19
20
21
22
# File 'lib/ama-entity-mapper/mixin/handler_support.rb', line 18

def declare_namespace_method(klass)
  klass.define_singleton_method(:handler_namespace) do |namespace|
    @handler_namespace = namespace
  end
end

.included(klass) ⇒ Object



13
14
15
16
# File 'lib/ama-entity-mapper/mixin/handler_support.rb', line 13

def included(klass)
  declare_namespace_method(klass)
  declare_handler_method(klass)
end