Advertisement
Guest User

Untitled

a guest
Aug 16th, 2016
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.59 KB | None | 0 0
  1. class JsonDSL
  2.  
  3.   attr_reader :dsl_attributes
  4.  
  5.   def initialize(to_eval, eval_args = nil)
  6.     @dsl_attributes = {}
  7.     if to_eval.is_a? String
  8.       instance_eval File.read(to_eval), to_eval
  9.     else
  10.       instance_exec eval_args, &to_eval
  11.     end
  12.   end
  13.  
  14.   def array!(opts, &blk)
  15.     if opts.is_a? Hash
  16.       sym, items = opts.first
  17.       @dsl_attributes[sym] = []
  18.       items.each do |item|
  19.         @dsl_attributes[sym] << JsonDSL.new(blk, item).dsl_attributes
  20.       end
  21.     else
  22.       @dsl_attributes = []
  23.       opts.each do |item|
  24.         @dsl_attributes << JsonDSL.new(blk, item).dsl_attributes
  25.       end
  26.     end
  27.   end
  28.  
  29.   def extract!(target, *attrs)
  30.     attrs.each do |att|
  31.       @dsl_attributes[att] = if target.is_a? Hash
  32.                                target[att] if target.key? att
  33.                              else
  34.                                begin
  35.                                  target.send(att)
  36.                                rescue
  37.                                  nil
  38.                                end
  39.                              end
  40.     end
  41.   end
  42.  
  43.   def method_missing(sym, *args, &blk)
  44.     @dsl_attributes[sym] = if ::Kernel.block_given?
  45.                              JsonDSL.new(blk).dsl_attributes
  46.                            else
  47.                              if args.count.zero?
  48.                                nil
  49.                              elsif args.count == 1
  50.                                args[0]
  51.                              else
  52.                                args
  53.                              end
  54.                            end
  55.   end
  56.  
  57. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement