def initialize super "Cannot define multiple 'included' blocks for a Concern" end end def self.extended(base) #:nodoc: base.instance_variable_set(:@_dependencies, []) end def append_features(base) if base.instance_variable_defined?(:@_dependencies) base.instance_variable_get(:@_dependencies) << self return false else return false if base < self @_dependencies.each { |dep| base.send(:include, dep) } super base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods) base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block) end end def included(base = nil, &block) if base.nil? raise MultipleIncludedBlocks if instance_variable_defined?(:@_included_block) @_included_block = block else super end end end end
initialize super "Cannot define multiple 'included' blocks for a Concern" end end def self.extended(base) #:nodoc: base.instance_variable_set(:@_dependencies, []) end def append_features(base) if base.instance_variable_defined?(:@_dependencies) base.instance_variable_get(:@_dependencies) << self return false else return false if base < self @_dependencies.each { |dep| base.send(:include, dep) } super base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods) base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block) end end def included(base = nil, &block) if base.nil? raise MultipleIncludedBlocks if instance_variable_defined?(:@_included_block) @_included_block = block else super end end end end ϙΠϯτͭ "DUJWF4VQQPSU$PODFSOΛFYUFOEͨ͠ ޙɺ.ϞδϡʔϧͷΠϯελϯεมʹɺ !@EFQFOEFODJFT<> ͕อ࣋͞ΕΔɻ TFMG"DUJWF4VQQPSU$PODFSO CBTF. module M extend ActiveSupport::Concern end FYUFOEͨ͠ϞδϡʔϧΠϯελϯεม!@EFQFODEFDJFTΛอ࣋ .Ϟδϡʔϧ . !@EFQFOEFODJFT<>
initialize super "Cannot define multiple 'included' blocks for a Concern" end end def self.extended(base) #:nodoc: base.instance_variable_set(:@_dependencies, []) end def append_features(base) … end def included(base = nil, &block) … end end end ϙΠϯτͭ FYUFOEͨ͠ϞδϡʔϧΫϥε֦ுʹΑΓɺ "DUJWF4VQQPSU$PODFSOϞδϡʔϧʹॴଐ͍ͯ͠Δ BQQFOE@GFBUVSFTͱJODMVEFEΛΫϥεɾϝιουͰ ݺͼग़ͤΔΑ͏ʹͳΔɻ TJOHMFUPO@DMBTT "DUJWF4VQQPSU$PODFSO Ϟδϡʔϧ . JODMVEFE BQQFOE@GFBUVSFT BODFTUPST .FYUFOE"DUJWF4VQQPSU$PODFSO .ಛҟΫϥε ˌ$ JODMVEFE BQQFOE@GFBUVSFT ˒ ˒ ˒Ϋϥε֦ுͷͨΊݺΔ .Ϟδϡʔϧ . !@EFQFOEFODJFT<> module M extend ActiveSupport::Concern end
end; end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end module M1 extend ActiveSupport::Concern def m1_instance_method; end; module ClassMethods def m1_extend_method; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; module ClassMethods def m2_extend_method; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end ·ͣ͜͜ͷ આ໌Λ͢Δ ϝιου࣮ߦɾೖ JODMVEF͞Εͨޙʹ࣮ߦ module M1 extend ActiveSupport::Concern def m1_instance_method; end; included do def self.method_injected_by_m1; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; included do def self.method_injected_by_m2; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; included do self.method_injected_by_m1 self.method_injected_by_m2 end end module M extend ActiveSupport::Concern include M3 end ࣮ࡍʹ࣮ߦ͞ΕΔ FYUFOE"DUJWF4VQQPSU$PODFSO ͍ͯ͠Δ͔Β͑Δ FYUFOE"DUJWF4VQQPSU$PODFSO ͍ͯ͠Δ͔Β͑Δ FYUFOE"DUJWF4VQQPSU$PODFSO ͍ͯ͠Δ͔Β͑Δ
end; end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end module M1 extend ActiveSupport::Concern def m1_instance_method; end; end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; end module M3 extend ActiveSupport::Concern include M2 include M1 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end
module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end جຊతͳྲྀΕ "DUJWF4VQQPSU$PODFSOϞδϡʔϧΛFYUFOEͨ͠.Ϟ δϡʔϧΛ.Ϟδϡʔϧ͕JODMVEF͢Δ͜ͱͰ.Ϟδϡʔϧ ͕Ϋϥε֦ுͰಘͨBQQFOE@GFBUVSFTΛணՐɻ ͜ΕΛ܁Γฦ͠࠷ޙɺNPEVMF.ʹJODMVEF.͞Εͨ࣌ʹɺ ͲͷΑ͏ʹ֤NPEVMF͕JODMVEF͞Ε͍ͯ͘ͷ͔ݟΔɻ ݁͜͏ͳΔ ͜ΕͲ͏͍͏͜ͱͳͷ͔ͦΕΛཧղ͍͖͍ͯͨ͠ɻ include Mˎ extend ActiveSupport::Concern ॱ൪ٯͰྑ͍ɻ
initialize super "Cannot define multiple 'included' blocks for a Concern" end end def self.extended(base) #:nodoc: base.instance_variable_set(:@_dependencies, []) end def append_features(base) if base.instance_variable_defined?(:@_dependencies) base.instance_variable_get(:@_dependencies) << self return false else return false if base < self @_dependencies.each { |dep| base.send(:include, dep) } super base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods) base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block) end end def included(base = nil, &block) if base.nil? raise MultipleIncludedBlocks if instance_variable_defined?(:@_included_block) @_included_block = block else super end end end end ͜͜ͷ෦ͷػೳΛݟ͍ͯ͘
end; end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end
m1_instance_method; end; end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end
extend ActiveSupport::Concern include M1 def m2_instance_method; end; end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end JODMVEF.Λ͢Δͱɺ.BQQFOE@GFBUVSFT . ͕ணՐɻ .Ϟδϡʔϧ!@EFQFOEFODJFT͕ఆٛ͞Ε͍ͯΔ͔Βͦ͜ʹ.Φϒ δΣΫτΛ֨ೲ
extend ActiveSupport::Concern include M1 def m2_instance_method; end; end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end "DUJWF4VQQPSU$PODFSOΛFYUFOEͨ͠ޙɺ.ϞδϡʔϧͷΠϯελ ϯεมʹɺ!@EFQFOEFODJFT<>͕อ࣋͞ΕΔɻ "DUJWF4VQQPSU$PODFSOͷΠϯελϯεɾϝιου͕.Ϟδϡʔϧͷ ΫϥεɾϝιουʹͳΔɻ Ϋϥε֦ு
initialize super "Cannot define multiple 'included' blocks for a Concern" end end def self.extended(base) #:nodoc: base.instance_variable_set(:@_dependencies, []) end def append_features(base) if base.instance_variable_defined?(:@_dependencies) base.instance_variable_get(:@_dependencies) << self return false else return false if base < self @_dependencies.each { |dep| base.send(:include, dep) } super base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods) base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block) end end def included(base = nil, &block) if base.nil? raise MultipleIncludedBlocks if instance_variable_defined?(:@_included_block) @_included_block = block else super end end end end ͜͜ͷ෦ͷػೳΛݟ͍ͯ͘
extend ActiveSupport::Concern include M1 def m2_instance_method; end; end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end ྻܕ NϞδϡʔϧ ͔Βࢀরͨ࣌͠ ͚ͩBODFTUPST ݁.Ϟδϡʔϧʹ.ɾ.ɾ.͕JODMVEF͞ΕΔ͕ɺ ͱͳΔɻ
ClassMethods def m1_extend_method; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; module ClassMethods def m2_extend_method; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end جຊతͳྲྀΕ "DUJWF4VQQPSU$PODFSOϞδϡʔϧΛFYUFOEͨ͠.Ϟ δϡʔϧΛ.Ϟδϡʔϧ͕JODMVEF͢Δ͜ͱͰ.Ϟδϡʔϧ ͕Ϋϥε֦ுͰಘͨBQQFOE@GFBUVSFTΛணՐɻ ͜ΕΛ܁Γฦ͠࠷ޙɺNPEVMF.ʹJODMVEF.͞Εͨ࣌ʹɺ ͲͷΑ͏ʹ֤NPEVMF͕JODMVEF͞Ε͍ͯ͘ͷ͔ݟΔɻ ݁͜͏ͳΔ ͜ΕͲ͏͍͏͜ͱͳͷ͔ͦΕΛཧղ͍͖͍ͯͨ͠ɻ
initialize super "Cannot define multiple 'included' blocks for a Concern" end end def self.extended(base) #:nodoc: base.instance_variable_set(:@_dependencies, []) end def append_features(base) if base.instance_variable_defined?(:@_dependencies) base.instance_variable_get(:@_dependencies) << self return false else return false if base < self @_dependencies.each { |dep| base.send(:include, dep) } super base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods) base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block) end end def included(base = nil, &block) if base.nil? raise MultipleIncludedBlocks if instance_variable_defined?(:@_included_block) @_included_block = block else super end end end end ͜͜ͷ෦ͷػೳΛݟ͍ͯ͘
ClassMethods def m1_extend_method; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; module ClassMethods def m2_extend_method; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end FYUFOE"DUJWF4VQQPSU$PODFSO͕ͳ͞ΕͨNPEVMFͷ FYUFOEΛޙճ͠ʹͰ͖ΔͨΊɺதؒNPEVMF .ɾ.ͳͲ ͰͷFYUFOE͕ൃੜͤͣɺΦʔόʔϔου͕ආ͚ΒΕΔɻ ॴ ॴ FYUFOE"DUJWF4VQQPSU$PODFSO͕ͳ͞ΕͨNPEVMFͷ FYUFOEΛޙճ͠ʹͰ͖ΔɻӈͷྫͳΒ ݁
initialize super "Cannot define multiple 'included' blocks for a Concern" end end def self.extended(base) #:nodoc: base.instance_variable_set(:@_dependencies, []) end def append_features(base) if base.instance_variable_defined?(:@_dependencies) base.instance_variable_get(:@_dependencies) << self return false else return false if base < self @_dependencies.each { |dep| base.send(:include, dep) } super base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods) base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block) end end def included(base = nil, &block) if base.nil? raise MultipleIncludedBlocks if instance_variable_defined?(:@_included_block) @_included_block = block else super end end end end ͜͜ͷ෦ͷػೳΛݟ͍ͯ͘ DMBTT@FWBMʹ͢CMPDL࣍ୈͰ ᶃϝιουΛCBTFʹఆٛͨ͠Γ ᶄϝιουΛCBTFͰ࣮ߦͨ͠Γ Ͱ͖Δ ϙΠϯτ̎ͭ M.class_eval do def self.method_injected_by_m1; end; end M.class_eval do self.method_injected_by_m2 end ΫϥεɾϝιουNFUIPE@JOKFDUFE@CZ@N Λ.ʹఆٛ͢Δ ΫϥεɾϝιουNFUIPE@JOKFDUFE@CZ@N Λ.Ͱ࣮ߦ͢Δ
initialize super "Cannot define multiple 'included' blocks for a Concern" end end def self.extended(base) #:nodoc: base.instance_variable_set(:@_dependencies, []) end def append_features(base) if base.instance_variable_defined?(:@_dependencies) base.instance_variable_get(:@_dependencies) << self return false else return false if base < self @_dependencies.each { |dep| base.send(:include, dep) } super base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods) base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block) end end def included(base = nil, &block) if base.nil? raise MultipleIncludedBlocks if instance_variable_defined?(:@_included_block) @_included_block = block else super end end end end ͜͜ͷ෦ͷػೳΛݟ͍ͯ͘ JODMVEFEEPʜFOEɺͦΕ͕ ᶃNPEVMFʹॻ͔Ε͍ͯͨΒɺCBTF͕OJMͰݺΕΔɻ ᶄNPEVMFʹॻ͔Ε͍ͯΔNPEVMFΛJODMVEFͨ͠ΒɺCBTF ݺͼग़͠ ͰݺΕΔɻ ͜ͷ̎ͭͷύλʔϯ͕͋Δɻ͔ͩΒ݅ذ͍ͯ͠Δɻ ϙΠϯτ̎ͭ ᶃ.ʹॻ͔Ε͍ͯͨΒɺCBTF͕OJMͰݺΕΔɻ ᶄ.ʹJODMVEFEϒϩοΫ͕ॻ͔Ε͓ͯΓɺͦΕΛ ɹJODMVEFͨ͠ΒɺCBTF . ͰݺΕΔɻ module M1 extend ActiveSupport::Concern def m1_instance_method; end; included do def self.method_injected_by_m1; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; included do def self.method_injected_by_m2; end; end end
module M1 extend ActiveSupport::Concern def m1_instance_method; end; included do def self.method_injected_by_m1; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; included do def self.method_injected_by_m2; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; ɹincluded do self.method_injected_by_m1 self.method_injected_by_m2 end end module M extend ActiveSupport::Concern include M3 end
self.method_injected_by_m1; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; included do def self.method_injected_by_m2; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; ɹincluded do self.method_injected_by_m1 self.method_injected_by_m2 end end module M extend ActiveSupport::Concern include M3 end .ϞδϡʔϧʹJODMVEFEEPʜFOEϒϩοΫ͕͋ Δ͔ΒɺCBTF OJM Ͱݺͼग़͞ΕΔɻ݁Ռɺ.Ϟ δϡʔϧʹ !@JODMVEFE@CMPDL1SPD͕อ࣋͞ΕΔɻ
self.method_injected_by_m1; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; included do def self.method_injected_by_m2; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; ɹincluded do self.method_injected_by_m1 self.method_injected_by_m2 end end module M extend ActiveSupport::Concern include M3 end ྻܕ .Ϟδϡʔϧʹ.Ϟδϡʔϧ࣮ࡍʹJODMVEF ͞Εͳ͍ͷͰԿ͓͖ͳ͍
self.method_injected_by_m1; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; included do def self.method_injected_by_m2; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; ɹincluded do self.method_injected_by_m1 self.method_injected_by_m2 end end module M extend ActiveSupport::Concern include M3 end ྻܕ .ϞδϡʔϧʹJODMVEFEEPʜFOEϒϩοΫ͕͋ Δ͔ΒɺCBTF OJM Ͱݺͼग़͞ΕΔɻ݁Ռɺ.Ϟ δϡʔϧʹ !@JODMVEFE@CMPDL1SPD͕อ࣋͞ΕΔɻ
self.method_injected_by_m1; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; included do def self.method_injected_by_m2; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; ɹincluded do self.method_injected_by_m1 self.method_injected_by_m2 end end module M extend ActiveSupport::Concern include M3 end ྻܕ .Ϟδϡʔϧʹ.Ϟδϡʔϧ࣮ࡍʹJODMVEF ͞Εͳ͍ͷͰԿ͓͖ͳ͍
self.method_injected_by_m1; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; included do def self.method_injected_by_m2; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; ɹincluded do self.method_injected_by_m1 self.method_injected_by_m2 end end module M extend ActiveSupport::Concern include M3 end ྻܕ .ϞδϡʔϧʹJODMVEFEEPʜFOEϒϩοΫ͕͋ Δ͔ΒɺCBTF OJM Ͱݺͼग़͞ΕΔɻ݁Ռɺ.Ϟ δϡʔϧʹ !@JODMVEFE@CMPDL1SPD͕อ࣋͞ΕΔɻ
self.method_injected_by_m1; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; included do def self.method_injected_by_m2; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; ɹincluded do self.method_injected_by_m1 self.method_injected_by_m2 end end module M extend ActiveSupport::Concern include M3 end ྻܕ M.class_eval do self.method_injected_by_m1 self.method_injected_by_m2 end ͕࣮ߦ͞ΕΔɻ
self.method_injected_by_m1; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; included do def self.method_injected_by_m2; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; ɹincluded do self.method_injected_by_m1 self.method_injected_by_m2 end end module M extend ActiveSupport::Concern include M3 end ྻܕ M.class_eval do def self.method_injected_by_m2 end end ͕࣮ߦ͞ΕɺMʹΫϥεɾϝιουʹೖ͞ΕΔ
self.method_injected_by_m1; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; included do def self.method_injected_by_m2; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; ɹincluded do self.method_injected_by_m1 self.method_injected_by_m2 end end module M extend ActiveSupport::Concern include M3 end ྻܕ M.class_eval do def self.method_injected_by_m2 end end ͕࣮ߦ͞ΕɺMʹΫϥεɾϝιουʹೖ͞ΕΔ
do def self.method_injected_by_m1; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; included do def self.method_injected_by_m2; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; ɹincluded do self.method_injected_by_m1 self.method_injected_by_m2 end end module M extend ActiveSupport::Concern include M3 end FYUFOE"DUJWF4VQQPSU$PODFSO͕ͳ͞ΕͨNPEVMFͷ FYUFOEΛޙճ͠ʹͰ͖ΔͨΊɺதؒNPEVMF .ɾ.ͳͲ ͰͷFYUFOE͕ൃੜͤͣɺΦʔόʔϔου͕ආ͚ΒΕΔɻ ॴ ॴ ϞδϡʔϧΛJODMVEFͨ࣌͠ʹɺΫϥεɾϝιουΛఆٛͨ͠ Γɺ ݺͼग़ͨ͠Ϟδϡʔϧʹೖͨ͠Γ ࣮ߦͨ͠ΓͰ͖Δɻ ݁
end; end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end module M1 extend ActiveSupport::Concern def m1_instance_method; end; module ClassMethods def m1_extend_method; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; module ClassMethods def m2_extend_method; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end ϝιου࣮ߦɾೖ JODMVEF͞Εͨޙʹ࣮ߦ module M1 extend ActiveSupport::Concern def m1_instance_method; end; included do def self.method_injected_by_m1; end; end end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; included do def self.method_injected_by_m2; end; end end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; included do self.method_injected_by_m1 self.method_injected_by_m2 end end module M extend ActiveSupport::Concern include M3 end ࣮ࡍʹ࣮ߦ͞ΕΔ FYUFOE"DUJWF4VQQPSU$PODFSO ͍ͯ͠Δ͔Β͑Δ FYUFOE"DUJWF4VQQPSU$PODFSO ͍ͯ͠Δ͔Β͑Δ FYUFOE"DUJWF4VQQPSU$PODFSO ͍ͯ͠Δ͔Β͑Δ
end; end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; end module M3 extend ActiveSupport::Concern include M2 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end module M1 extend ActiveSupport::Concern def m1_instance_method; end; end module M2 extend ActiveSupport::Concern include M1 def m2_instance_method; end; end module M3 extend ActiveSupport::Concern include M2 include M1 def m3_instance_method; end; end module M extend ActiveSupport::Concern include M3 end ॻ͕͍͍࣌ͬͪ͘͜