Web APIのレスポンスから動的にクラスを生成してみた

この記事を読んで,動的にクラスを生成する場合はどう書くのかなぁと思って,書いてみた(だからどうしたってかんじだけど).

# coding: utf-8
require 'json'
require 'faraday'

conn = Faraday.new do |builder|
  builder.request :url_encoded
  builder.request :retry
  builder.adapter :net_http
end

# ベーシック認証の設定
conn.basic_auth("username", "password")

# Web API 呼び出し
response = conn.get do |req|
  req.url "https://api.bitbucket.org/1.0/user"
end

# レスポンスボディを JSON に変換
json = JSON.parse(response.body)

# 動的にクラスを定義 
class_name = "User"
user = json[class_name.downcase]

Object.const_set(class_name.to_sym, Class.new do
  user.keys.each do |key|
    attr_accessor key.to_sym 
  end
end)

# 動的に定義したクラスのpublicメソッドを表示(継承したものは除く)
puts User.new.public_methods(false)

ちょっと黒魔術っぽい

追記

こんなことしなくてもOpenStructを継承したクラスをつくればいいじゃんと思った