@@ -31,7 +31,8 @@ def []=(name, definition)
31
31
name = name . to_sym
32
32
raise Errors ::InvalidBlueprint , "You may not redefine the default view" if name == :default
33
33
34
- @pending [ name ] = definition
34
+ @pending [ name ] ||= [ ]
35
+ @pending [ name ] << definition
35
36
end
36
37
37
38
#
@@ -46,14 +47,18 @@ def [](name)
46
47
@mut . synchronize do
47
48
next if @views . key? ( name )
48
49
49
- p = @pending [ name ]
50
+ defs = @pending [ name ]
51
+ inherit_fields = defs . reduce ( true ) { |acc , d | d . fields . nil? ? acc : d . fields }
52
+ inherit_options = defs . reduce ( true ) { |acc , d | d . options . nil? ? acc : d . options }
53
+ inherit_extensions = defs . reduce ( true ) { |acc , d | d . extensions . nil? ? acc : d . extensions }
54
+
50
55
view = Class . new ( @parent )
51
56
view . views . reset
52
57
view . append_name ( name )
53
- view . schema . clear unless p . fields
54
- view . options . clear unless p . options
55
- view . extensions . clear unless p . extensions
56
- view . class_eval ( &p . definition ) if p . definition
58
+ view . schema . clear unless inherit_fields
59
+ view . options . clear unless inherit_options
60
+ view . extensions . clear unless inherit_extensions
61
+ defs . each { | d | view . class_eval ( &d . definition ) if d . definition }
57
62
view . eval! ( false )
58
63
@views [ name ] = view
59
64
end
@@ -66,6 +71,7 @@ def fetch(name)
66
71
self [ name ] || raise ( KeyError , "View '#{ name } ' not found" )
67
72
end
68
73
74
+ # Yield each name and view
69
75
def each ( &block )
70
76
enum = Enumerator . new do |y |
71
77
y . yield ( :default , self [ :default ] )
@@ -77,7 +83,9 @@ def each(&block)
77
83
# Create a duplicate of this builder with a different default view
78
84
def dup_for ( blueprint )
79
85
builder = self . class . new ( blueprint )
80
- @pending . each { |name , definition | builder [ name ] = definition }
86
+ @pending . each do |name , defs |
87
+ defs . each { |d | builder [ name ] = d }
88
+ end
81
89
builder
82
90
end
83
91
0 commit comments