Rob Miller
Rob Miller

Reputation: 228

Monkeypatching from a Sinatra helper

I've defined a Sinatra helper in the usual way:

module Sinatra
  module FooHelper
    # code goes here
  end
end

In my helper, among other things, I'd like to add a method to Numeric:

module Sinatra
  module FooHelper
    class ::Numeric
      def my_new_method
      end
    end
  end
end

However, in the interests of being unobtrusive, I only want to do add this method if my Sinatra helper is actually included in an application; if nobody runs helpers Sinatra::FooHelper, I don't want to affect anything (which seems like a reasonable thing to expect of a Sinatra extension).

Is there any hook that's fired when my helper is included, that would enable me to add my method only once that happens?

Upvotes: 1

Views: 247

Answers (1)

Jacob Brown
Jacob Brown

Reputation: 7561

You can use the Module#included method to do this. I think you will need to modify your class definition slightly to use class_eval. I've tested the following and it works as expected:

module Sinatra
  module FooHelper    
    def self.included(mod)
      ::Numeric.class_eval do
        def my_new_method
          return "whatever"
        end
      end
    end
  end  
end

Upvotes: 1

Related Questions