Module: Concern::ClassMethods

Defined in:
lib/concern.rb

Instance Method Summary collapse

Instance Method Details

#concern(lib, options = {}) ⇒ Object



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
# File 'lib/concern.rb', line 38

def concern(lib, options={})
  concern = Concern.class_from_lib(lib)
  accessor = lib.split('/').last.to_sym

  Concern.add_accessor_for_concern(self, accessor, concern)

  # tell the concern it was included
  concerned = eval(name) #self.class is always Class, but name is class that called concern
  concern.included(concerned) if concern.respond_to? :included

  # delegate methods calls to the concern
  if options[:delegate]
    methods_to_delegate = if options[:delegate].is_a?(Array)
      options[:delegate]
    else
      concern.public_instance_methods(false)
    end

    methods_to_delegate.each do |method|
      class_eval <<-EOF, __FILE__, __LINE__
        def #{method}(*args, &block)
          #{accessor}.send(:#{method}, *args, &block)
        end
      EOF
    end
  end
end