Question

I have some problem with extending class with instance method after separate module is included into separate class

module ActsAsCommentable
  def self.included(commentable)
    Thread.class_eval do
      def commentable
        p "disqusable is #{commentable}"
        p "disqusable class is #{commentable}"
      end
    end
  end
end


class Thread
  #some code...
end

class Asset
  include ActsAsCommentable
end

And now I want to call this method somelike this:

thread = Thread.new
thread.commentable

The problem is, of course is that there is no binding with include method for class eval, and I could save variables that I want to pass into class eval in ActsAsCommentable module, but I dont want to. Is there a better way?

I tried to do instead

module ActsAsCommentable
  def self.included(commentable)
    class << Thread
      define_method :commentable do
        p "disqusable is #{commentable}"
        p "disqusable class is #{commentable}"
      end
    end
  end
end

But As I guessed this creates instance method for singletone object of class and therefore I can call it only through

Thread.commentable

And again, no binding...

Was it helpful?

Solution

If I understand you correctly, you need to be able to access the commentable variable inside your Thread extension, right?

If so, just change this:

Thread.class_eval do

To this:

Thread.class_exec(commentable) do |commentable|

And it should work.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top