Why 'self' method of module cannot become a singleton method of class?
ruby
Solution
If you want to have both class methods and instance methods mixed into a class when including a module, you may follow the pattern:
module YourModule
module ClassMethods
def a_class_method
puts "I'm a class method"
end
end
def an_instance_method
puts "I'm an instance method"
end
def self.included(base)
base.extend ClassMethods
end
end
class Whatever
include YourModule
end
Whatever.a_class_method
# => I'm a class method
Whatever.new.an_instance_method
# => I'm an instance method
Basically to over-simplify it, you `extend` to add class methods and you `include` to add instance methods. When a module is included, it's `#included` method is invoked, with the actual class it was included in. From here you can `extend` the class with some class methods from another module. This is quite a common pattern.
See also: http://api.rubyonrails.org/classes/ActiveSupport/Concern.html
Problem
``` module Test def self.model_method puts "this is a module method" end end class A include Test end A.model_method ``` this will be error with: undefined method `model_method' for A:Class (NoMethodError) But when I use metaclass of A. it works: ``` module Test def model_method puts "this is a module method" end end class A class << self include Test end end A.model_method ``` Can someone explain this?