57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
# File 'lib/shared.rb', line 57
def shared name, options = {}, &block
key = key_for name
via = (options[:via]||options['via']||:eval).to_s.to_sym
if block.nil?
Shared.load(key)
return Code[key]
end
m = (Code[key] || Module.new)
case via
when :eval
singleton_class(m) do
unless m.respond_to?(:blocks)
blocks = []
define_method(:blocks){ blocks }
define_method(:included) do |other|
blocks.each{|b| other.send(:module_eval, &b)}
end
define_method(:extend_object) do |other|
Shared.singleton_class(other) do
m.blocks.each{|b| module_eval &b}
end
end
end
end
m.blocks << block
when :module
m.send(:module_eval, &block)
end
Code[key] ||= m
end
|