class A4Tools::ObjectBuilder

Attributes

description_text[R]
generate_block[R]
id[RW]
is_cached[R]

Public Class Methods

[](identifier) click to toggle source
# File lib/object_builder/object_builder.rb, line 83
def [](identifier)
  @definitions[identifier.to_sym]
end
[]=(identifier, defn) click to toggle source
# File lib/object_builder/object_builder.rb, line 87
def []=(identifier, defn)
  @definitions[identifier.to_sym] = defn
end
builders() click to toggle source
# File lib/object_builder/object_builder.rb, line 64
def builders
  @definitions.values
end
builders_for_name(name) click to toggle source
# File lib/object_builder/object_builder.rb, line 68
def builders_for_name(name)
  @definitions.values.select do |defn|
    defn.name_matches?(name)
  end
end
cache(is_cached) click to toggle source
# File lib/object_builder/object_builder.rb, line 105
def cache(is_cached)
  @is_cached = is_cached
end
define_with_directory(directory) click to toggle source
# File lib/object_builder/object_builder.rb, line 32
def define_with_directory(directory)
  Dir[File.join(directory, "*")].map { |file| define_with_filename(file) }
end
define_with_filename(filename) click to toggle source
# File lib/object_builder/object_builder.rb, line 36
def define_with_filename(filename)
  contents = IO.read(filename)
  id = File.basename(filename).gsub(/\..*$/, "").to_sym
  return define_with_script(contents, id) if filename.end_with? ".rb"
  define_with_json(contents, id)
end
define_with_json(string, id=nil, description=nil) click to toggle source
# File lib/object_builder/object_builder.rb, line 50
def define_with_json(string, id=nil, description=nil)
  object = symbolify(JSON.parse(string))
  description ||= object[:___description] || "Supplied from JSON"
  definition = Class.new(A4Tools::ObjectBuilder) do
    generate { self.class.instance_variable_get("@obj") }
  end
  
  object.delete(:__description)
  definition.class_eval("description \"#{description}\"")
  definition.instance_variable_set("@obj", object)
  definition.id = id.to_sym
  definition.new
end
define_with_script(script, id) click to toggle source
# File lib/object_builder/object_builder.rb, line 43
def define_with_script(script, id)
  definition = Class.new(A4Tools::ObjectBuilder) {}
  definition.id = id
  definition.class_eval(script, id.to_s)
  definition.new
end
description(desc) click to toggle source
# File lib/object_builder/object_builder.rb, line 101
def description(desc)
  @description_text = desc
end
generate(&block) click to toggle source
# File lib/object_builder/object_builder.rb, line 109
def generate(&block)
  @generate_block = block
end
identifier(id) click to toggle source

DSL stuff for defining items

# File lib/object_builder/object_builder.rb, line 97
def identifier(id)
  @id = id
end
identifiers_like(id) click to toggle source
# File lib/object_builder/object_builder.rb, line 91
def identifiers_like(id)
  @definitions.keys.select { |key| key.to_s.start_with? id.to_s }
end
load_object(obj, id, description) click to toggle source
# File lib/object_builder/object_builder.rb, line 27
def load_object(obj, id, description)
  obj = JSON.generate(obj) unless obj.is_a? String
  @definitions[id.to_sym] = define_with_json(obj, id.to_sym, description)
end
load_objects() click to toggle source
# File lib/object_builder/object_builder.rb, line 7
def load_objects
  @definitions = {}
  load_path(File.join(File.dirname(__FILE__), "definitions"))
end
load_path(path) click to toggle source
# File lib/object_builder/object_builder.rb, line 12
def load_path(path)
  if File.directory?(path) then
    define_with_directory(path).each do |defn|
      @definitions[defn.identifier] = defn
    end
    true
  elsif File.file?(path) then
    defn = define_with_filename(path)
    @definitions[defn.identifier] = defn
    true
  else
    false
  end
end
supported_classes(truncate=true) click to toggle source
# File lib/object_builder/object_builder.rb, line 74
def supported_classes(truncate=true)
  r = {}
  @definitions.each do |id, defn|
    key = truncate ? talk.truncated_name(defn.name) : defn.name
    r[key] = true
  end
  r.keys
end

Public Instance Methods

block_call(&block) click to toggle source
# File lib/object_builder/object_builder.rb, line 114
def block_call(&block)
  self.class.send(:define_method, :__block_call, &block)
  self.class.send(:instance_method, :__block_call).bind(self).call
end
description() click to toggle source
# File lib/object_builder/object_builder.rb, line 132
def description
  self.class.description_text
end
identifier() click to toggle source
# File lib/object_builder/object_builder.rb, line 119
def identifier
  self.class.id
end
name() click to toggle source
# File lib/object_builder/object_builder.rb, line 127
def name
  value if @cached.nil?
  @cached[:__class] || ""
end
name_matches?(other) click to toggle source
# File lib/object_builder/object_builder.rb, line 123
def name_matches?(other)
  name.end_with? other.to_s
end
value() click to toggle source
# File lib/object_builder/object_builder.rb, line 136
def value
  return @cached unless @cached.nil? or not self.class.is_cached
  v = block_call(&self.class.generate_block)
  v.delete(:__description)
  @cached = v
end