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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
# File 'lib/extend_it/dsl.rb', line 29
def dsl(&block)
if @dsl.nil?
parent = superclass.respond_to?(:dsl) ? [superclass.dsl] : []
end
@dsl ||= Class.new(*parent) do
extend DslMethods
def initialize(receiver)
if receiver.nil? || receiver.frozen?
fail(ArgumentError, 'DSL receiver should be non-frozen object')
end
@dsl_receiver = receiver
end
private
attr_reader :dsl_receiver
def dsl_get(var_name, default = nil)
var_name = var_name.ensure_symbol!(name_of: :instance_variable)
if default.nil? && !block_given?
fail(ArgumentError, '`default` or block should be specified')
end
if dsl_receiver.instance_variable_defined?(var_name)
dsl_receiver.instance_variable_get(var_name)
else
default = yield if block_given?
dsl_receiver.instance_variable_set(var_name, default)
end
end
def dsl_set(var_name, value)
var_name = var_name.ensure_symbol!(name_of: :instance_variable)
setter_name = var_name.ensure_symbol!(name_of: :setter)
if dsl_receiver.respond_to?(setter_name)
dsl_receiver.send(setter_name, value)
else
dsl_receiver.instance_variable_set(var_name, value)
end
end
end
@dsl.class_eval(&block) if block_given?
@dsl
end
|