Я успешно создал гем, имеющий некоторые классы и модули, которые могут быть похожи на что-то подобное в ЛЮБОМ классе в проекте Rails:
class AnyRubyOrActiveModelClass
acts_as_anything [:foo, :bar]
def foo
.. do some foo
end
def self.bar
.. do some bar
end
end
Для этого я создал Модуль вмой драгоценный камень, который выглядел примерно так:
module InstanceMagic
class << self.class.superclass
define_method(:acts_as_anything) do |methods|
self.class_eval do
include ClassMagic
.. do some alias_method with given methods
end
end
end
Этот модуль успешно связал мой метод: foo из приведенного выше примера, второй модуль ClassMagic сделал то же самое для моего метода: bar class (следуя совету here ).
В тестовом проекте этот подход работал очень хорошо.В реальном проекте это привело к вмешательству в другой драгоценный камень, использующий, возможно, похожий подход.Этот драгоценный камень жаловался на отсутствующие методы в классе, даже когда я только интегрировал свой драгоценный камень в проект - даже не интегрировал Act_as_anything в класс.
Итак, я разбил свой код только на следующее:
module InstanceMagic
class << self.class.superclass
define_method(:acts_as_anything) do |methods|
#really empty here
end
end
В результате другой драгоценный камень все еще ломается.
Я использовал класс << self.class.superclass для явного расширения Object, так что это затрагивает даже классы, отличные от ActiveSomething, но ВСЕ классы, и мой act_as_anything доступен.Итак, я остаюсь с тремя вопросами. </p>
Почему последние 5 строк кода ломают другой драгоценный камень и заставляют его жаловаться на отсутствующие методы, которые он пытается динамически создать?Я хотел бы понять.
Есть ли лучший подход для достижения моей цели?
Когда я использую method_added и singleton_method_added (что я на самом деле делаю внутри своих модулей), я должен искать эти методысуществуют ли они уже, под псевдонимом «оригинальные», вставьте мои и назовите оригинальные после того, как я выполню свою работу?
Зная, что это много, я все еще надеюсь, что кто-то может направить меня в правильном направлении.
Спасибо.Felix