Class: Tainbox::AttributeDefiner

Inherits:
Object
  • Object
show all
Defined in:
lib/tainbox/attribute_definer.rb

Instance Method Summary collapse

Constructor Details

#initialize(klass, attribute_name, requested_type, requested_args) ⇒ AttributeDefiner

Returns a new instance of AttributeDefiner.



9
10
11
12
13
14
# File 'lib/tainbox/attribute_definer.rb', line 9

def initialize(klass, attribute_name, requested_type, requested_args)
  @klass = klass
  @attribute_name = attribute_name.to_sym
  @requested_type = requested_type
  @requested_args = requested_args
end

Instance Method Details

#define_getterObject



16
17
18
19
20
21
22
23
24
25
26
# File 'lib/tainbox/attribute_definer.rb', line 16

def define_getter
  klass.tainbox_register_attribute(attribute_name)
  attribute = attribute_name

  klass.tainbox_layer.instance_eval do
    define_method(attribute) do
      value = instance_variable_get(:"@tainbox_#{attribute}")
      value.is_a?(Tainbox::DeferredValue) ? instance_exec(&value.proc) : value
    end
  end
end

#define_setterObject



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/tainbox/attribute_definer.rb', line 28

def define_setter
  klass.tainbox_register_attribute(attribute_name)

  attribute = attribute_name
  args = requested_args
  type = requested_type

  klass.tainbox_layer.instance_eval do

    define_method("#{attribute}=") do |value|
      tainbox_register_attribute_provided(attribute)
      value = Tainbox::TypeConverter.new(type, value, options: args).convert if type
      instance_variable_set(:"@tainbox_#{attribute}", value)
    end

    define_method("tainbox_set_default_#{attribute}") do
      if args.has_key?(:default)
        tainbox_register_attribute_provided(attribute)
        value = args[:default].deep_dup
        value = Tainbox::DeferredValue.new(value) if value.is_a?(Proc)
        instance_variable_set(:"@tainbox_#{attribute}", value)

      else
        tainbox_unregister_attribute_provided(attribute)
        instance_variable_set(:"@tainbox_#{attribute}", nil)
      end
    end
  end
end