Slide 11
Slide 11 text
1 module ActiveSupport
2 module Concern
3 class MultipleIncludedBlocks < StandardError #:nodoc:
4 def initialize
5 super "Cannot define multiple 'included' blocks for a Concern"
6 end
7 end
8
9 def self.extended(base) #:nodoc:
10 base.instance_variable_set(:@_dependencies, [])
11 end
12
13 def append_features(base)
14 if base.instance_variable_defined?(:@_dependencies)
15 base.instance_variable_get(:@_dependencies) << self
16 return false
17 else
18 return false if base < self
19 @_dependencies.each { |dep| base.include(dep) }
20 super
21 base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods)
22 base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block)
23 end
24 end
25
26 def included(base = nil, &block)
27 if base.nil?
28 raise MultipleIncludedBlocks if instance_variable_defined?(:@_included_block)
29
30 @_included_block = block
31 else
32 super
33 end
34 end
35
36 def class_methods(&class_methods_module_definition)
37 mod = const_defined?(:ClassMethods, false) ?
38 const_get(:ClassMethods) :
39 const_set(:ClassMethods, Module.new)
40
41 mod.module_eval(&class_methods_module_definition)
42 end
43 end
44 end