plugin_builder.rb 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. require 'plugin'
  2. class PluginBuilder
  3. attr_accessor :plugin_objects
  4. def construct_plugin(plugin_name, object_map_yaml, system_objects)
  5. # @streaminator.stdout_puts("Constructing plugin #{plugin_name}...", Verbosity::OBNOXIOUS)
  6. object_map = {}
  7. @plugin_objects = {}
  8. @system_objects = system_objects
  9. if object_map_yaml
  10. @object_map = YAML.load(object_map_yaml)
  11. @object_map.each_key do |obj|
  12. construct_object(obj)
  13. end
  14. else
  15. raise "Invalid object map for plugin #{plugin_name}!"
  16. end
  17. return @plugin_objects
  18. end
  19. private
  20. def camelize(underscored_name)
  21. return underscored_name.gsub(/(_|^)([a-z0-9])/) {$2.upcase}
  22. end
  23. def construct_object(obj)
  24. if @plugin_objects[obj].nil?
  25. if @object_map[obj] && @object_map[obj]['compose']
  26. @object_map[obj]['compose'].each do |dep|
  27. construct_object(dep)
  28. end
  29. end
  30. build_object(obj)
  31. end
  32. end
  33. def build_object(new_object)
  34. if @plugin_objects[new_object.to_sym].nil?
  35. # @streaminator.stdout_puts("Building plugin object #{new_object}", Verbosity::OBNOXIOUS)
  36. require new_object
  37. class_name = camelize(new_object)
  38. new_instance = eval("#{class_name}.new(@system_objects, class_name.to_s)")
  39. new_instance.plugin_objects = @plugin_objects
  40. @plugin_objects[new_object.to_sym] = new_instance
  41. end
  42. end
  43. end