Class: Decay::Metaprogramming
- Inherits:
-
Object
- Object
- Decay::Metaprogramming
- Defined in:
- lib/decay/metaprogramming.rb
Instance Method Summary collapse
- #define_active_record_attribute ⇒ Object
- #define_active_record_bang_setters ⇒ Object
- #define_active_record_question_getters ⇒ Object
- #define_active_record_scopes ⇒ Object
- #define_bang_setters ⇒ Object
- #define_enumerated_type ⇒ Object
- #define_getter ⇒ Object
- #define_question_getters ⇒ Object
- #define_setter ⇒ Object
-
#initialize(class:, enumerated_type:, enumerated_type_name:) ⇒ Metaprogramming
constructor
A new instance of Metaprogramming.
Constructor Details
#initialize(class:, enumerated_type:, enumerated_type_name:) ⇒ Metaprogramming
Returns a new instance of Metaprogramming.
3 4 5 6 7 |
# File 'lib/decay/metaprogramming.rb', line 3 def initialize(class:, enumerated_type:, enumerated_type_name:) @klass = binding.local_variable_get(:class) @enumerated_type = enumerated_type @enumerated_type_name = enumerated_type_name end |
Instance Method Details
#define_active_record_attribute ⇒ Object
71 72 73 74 |
# File 'lib/decay/metaprogramming.rb', line 71 def define_active_record_attribute @klass.attribute @enumerated_type_name, \ Decay::ActiveEnumAttribute.new(enum: @enumerated_type) end |
#define_active_record_bang_setters ⇒ Object
76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/decay/metaprogramming.rb', line 76 def define_active_record_bang_setters enumerated_type_name = @enumerated_type_name @enumerated_type.each do |key, _value| if key.nil? next end assert_instance_conflict_free("#{key}!") @klass.send(:define_method, "#{key}!") do send("#{enumerated_type_name}=", key) end end end |
#define_active_record_question_getters ⇒ Object
91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/decay/metaprogramming.rb', line 91 def define_active_record_question_getters enumerated_type_name = @enumerated_type_name @enumerated_type.each do |key, value| if key.nil? next end assert_instance_conflict_free("#{key}?") @klass.send(:define_method, "#{key}?") do send(enumerated_type_name) == value end end end |
#define_active_record_scopes ⇒ Object
106 107 108 109 110 111 112 113 114 115 |
# File 'lib/decay/metaprogramming.rb', line 106 def define_active_record_scopes enumerated_type_name = @enumerated_type_name @enumerated_type.each do |key, value| if key assert_scope_conflict_free(key) @klass.scope key, -> { where(enumerated_type_name => value.value) } end end end |
#define_bang_setters ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/decay/metaprogramming.rb', line 41 def define_bang_setters enumerated_type_name = @enumerated_type_name @enumerated_type.each do |key, value| if key.nil? next end assert_instance_conflict_free("#{key}!") @klass.send(:define_method, "#{key}!") do instance_variable_set("@#{enumerated_type_name}", value) end end end |
#define_enumerated_type ⇒ Object
9 10 11 |
# File 'lib/decay/metaprogramming.rb', line 9 def define_enumerated_type @klass.const_set(@enumerated_type_name.to_s.upcase, @enumerated_type) end |
#define_getter ⇒ Object
13 14 15 16 17 18 19 20 |
# File 'lib/decay/metaprogramming.rb', line 13 def define_getter enumerated_type_name = @enumerated_type_name assert_instance_conflict_free(enumerated_type_name) @klass.send(:define_method, enumerated_type_name) do instance_variable_get("@#{enumerated_type_name}") end end |
#define_question_getters ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/decay/metaprogramming.rb', line 56 def define_question_getters enumerated_type_name = @enumerated_type_name @enumerated_type.each do |key, value| if key.nil? next end assert_instance_conflict_free("#{key}?") @klass.send(:define_method, "#{key}?") do instance_variable_get("@#{enumerated_type_name}") == value end end end |
#define_setter ⇒ Object
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/decay/metaprogramming.rb', line 22 def define_setter enumerated_type = @enumerated_type enumerated_type_name = @enumerated_type_name assert_instance_conflict_free("#{enumerated_type_name}=") @klass.send(:define_method, "#{enumerated_type_name}=") do |new_value| value = if new_value.respond_to?(:to_sym) new_value.to_sym else new_value end enum = enumerated_type[value] instance_variable_set("@#{enumerated_type_name}", enum) end end |