Получить расширенный объект из нескольких украшений - PullRequest
0 голосов
/ 25 сентября 2018

Используя SimpleDelegator, я создал несколько декораторов для добавления дополнительных функций к моим объектам.Мне нужно украсить объект дважды, как показано ниже:

Tracked.new(Audited.new(User.new))).save

Вот основная структура декоратора (ов):

class Tracked #or Audited
  delegate :id, to: :__getobj__

  def initialize(extened_object)
    super(extened_object)
    @extened_object = extened_object
  end

  def itself
    __getobj__
  end

  def save
    super
    # the extended behavior
  end
end

Я хочу получить доступ к классу Userот объекта.В Audited, если я позвоню @extended_object.class с Audited.new(User.new)).save, я получу UserTracked, если я звоню @extended_object.class с Tracked(Audited.new(User.new))).save, вместо этого я получаю Audited.

Как я могу получить класс extended_object независимо от того, сколько раз я его украшал?

1 Ответ

0 голосов
/ 25 сентября 2018

Я не думаю, что вы можете сделать это с SimpleDelegator.

Вам нужно реализовать этот метод самостоятельно.

Например:

class MyDelegator < SimpleDelegator
  def original_object
    obj = __getobj__
    obj.is_a?(MyDecorator) ? obj.original_object : obj
  end
end

Ивсе ваши декораторы должны быть унаследованы от MyDelegator

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...