Похоже, вы хотите, чтобы возвращаемое значение Myclass::get
было экземпляром Myclass
.Если это так, вы можете кешировать возвращаемое значение из HTTP-запроса и реализовать method_missing
для возврата значений из этого хеша:
class Myclass
include HTTParty
attr_accessor :retrieved_values
def method_missing(method, *args, &block)
if retrieved_values.key?(method)
retrieved_values[method]
else
super
end
end
def self.get_with_massaging(url)
new.tap do |instance|
instance.retrieved_values = get_without_massaging(url)
end
end
class << self
alias_method :get_without_massaging, :get
alias_method :get, :get_with_massaging
end
end
Это не совсем то, что вы просили, потому что это работает толькона один уровень глубины - т. е. x.questions[0].title
должно быть x.questions[0][:title]
x = Myclass.get('http://api.stackoverflow.com/1.0/questions?tags=HTTParty')
p x.total
p x.questions[0][:title]
Возможно, вы могли бы придумать какой-нибудь гибрид этого ответа и Джошуа Крик, чтобы воспользоваться преимуществом OpenStruct.* Я также должен отметить, что все хитрости псевдонимов методов не нужны, если у вашего метода нет с именем get
.