2013-07-16 2 views
1

Я определил помощник Синатры обычного способа:Monkeypatching от помощника Синатра

module Sinatra 
    module FooHelper 
    # code goes here 
    end 
end 

В моем помощнике, между прочим, я хотел бы добавить метод Numeric:

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

Однако, в интересах ненавязчивости, я хочу только добавить этот метод, если мой помощник Sinatra фактически включен в приложение; если никто не работает helpers Sinatra::FooHelper, я не хочу ничего влиять (что кажется разумным ожиданием от расширения Sinatra).

Есть ли какой-либо крючок, который был запущен, когда включен мой помощник, который позволит мне добавить мой метод только один раз, когда это произойдет?

+0

Может кто-нибудь «потребует» это, а затем не использовать его? – iain

+0

@ iain возможно, что они могут включать его в одну часть модульного приложения Sinatra, но не в другом - я понимаю, что это не совсем самая лучшая вещь в мире, но я бы хотел написать как можно более чистое расширение/практично. –

+0

Если вы собираетесь это сделать, я бы сказал, почему бы не использовать метод класса? Нет исправления, может возвращать тот же тип, легко понять, в конечном счете, намного чище. Бит более уродливый, хотя :) – iain

ответ

1

Для этого вы можете использовать метод Module#included. Я думаю, вам нужно немного изменить определение класса, чтобы использовать class_eval. Я протестировал следующее и работает как ожидалось:

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

Это работает отлично - спасибо! –

Смежные вопросы