20
21
22
23
24
25
26
27
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
57
58
59
60
61
62
63
64
65
66
67
|
# File 'lib/object_state/state.rb', line 20
def self.setup_attributes(owner_class, &block)
temp_class = Class.new(Object)
temp_class.define_singleton_method :attr_accessor do |*names|
@attr_accessor_names ||= []
@attr_accessor_names.concat Array(names)
super(*names)
end
temp_class.define_singleton_method :attr_accessor_names do
Array(@attr_accessor_names)
end
is_mongoid_document = !!defined?(::Mongoid::Document) && owner_class.ancestors.include?(::Mongoid::Document)
is_virtus_model = owner_class.respond_to?(:attribute_set)
temp_class.class_eval do
include ::Mongoid::Document if is_mongoid_document
include Virtus.model if is_virtus_model
instance_eval(&block)
end
excluded_attr_accessor_names = i(validation_context _index before_callback_halted)
(temp_class.attr_accessor_names - excluded_attr_accessor_names).each do |name|
next if attribute_set.map(&:name).include?(name.to_sym)
attribute name
end
if is_mongoid_document
temp_class.fields.except(*%w(_id)).each do |name, field|
next if attribute_set.map(&:name).include?(name.to_sym)
attribute name, field.type
end
end
if is_virtus_model
temp_class.attribute_set.each do |att|
next if attribute_set.map(&:name).include?(att.name.to_sym)
attribute att.name, att.type
end
end
owner_class.class_eval(&block)
end
|