Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class JsonDSL
- attr_reader :dsl_attributes
- def initialize(to_eval, eval_args = nil)
- @dsl_attributes = {}
- if to_eval.is_a? String
- instance_eval File.read(to_eval), to_eval
- else
- instance_exec eval_args, &to_eval
- end
- end
- def array!(opts, &blk)
- if opts.is_a? Hash
- sym, items = opts.first
- @dsl_attributes[sym] = []
- items.each do |item|
- @dsl_attributes[sym] << JsonDSL.new(blk, item).dsl_attributes
- end
- else
- @dsl_attributes = []
- opts.each do |item|
- @dsl_attributes << JsonDSL.new(blk, item).dsl_attributes
- end
- end
- end
- def extract!(target, *attrs)
- attrs.each do |att|
- @dsl_attributes[att] = if target.is_a? Hash
- target[att] if target.key? att
- else
- begin
- target.send(att)
- rescue
- nil
- end
- end
- end
- end
- def method_missing(sym, *args, &blk)
- @dsl_attributes[sym] = if ::Kernel.block_given?
- JsonDSL.new(blk).dsl_attributes
- else
- if args.count.zero?
- nil
- elsif args.count == 1
- args[0]
- else
- args
- end
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement