class Vizkit::PluginSpec
Attributes
callback_specs[R]
plugin_name[R]
Public Class Methods
new(plugin_name)
click to toggle source
# File lib/vizkit/plugin.rb, line 419 def initialize(plugin_name) PluginHelper.normalize_obj(plugin_name) @plugin_name = PluginHelper.normalize_obj(plugin_name,false).first @creation_method = nil @callback_specs = Array.new @created_plugins = Array.new @extensions = Array.new @file_names = Array.new @flags = {:deprecated => false} @on_create_hook = nil end
Public Instance Methods
callback_spec(value,callback_type=nil,default=nil,method_name=nil,&block)
click to toggle source
# File lib/vizkit/plugin.rb, line 470 def callback_spec(value,callback_type=nil,default=nil,method_name=nil,&block) spec = if value.is_a? CallbackSpec value else CallbackSpec.new(value,callback_type,default,method_name,&block) end spec2 = find_callback_spec!({:argument => spec.argument ,:callback_type => spec.callback_type}) if spec2 Vizkit.warn "#{plugin_name}: Ignoring callback for #{spec.argument} and callback type #{spec.callback_type}" Vizkit.warn "because only one callback per value and callback type is allowed." Vizkit.warn "Please remove the register_widget_for #{plugin_name},#{spec.argument} statement from" Vizkit.warn file_names return self end @callback_specs << spec self end
clone()
click to toggle source
# File lib/vizkit/plugin.rb, line 435 def clone obj = self.dup obj.instance_variable_set(:@callback_specs,@callback_specs.map{|element| element.clone}) obj.instance_variable_set(:@flags,@flags.clone) obj end
create_plugin(parent=nil)
click to toggle source
# File lib/vizkit/plugin.rb, line 546 def create_plugin(parent=nil) raise "Plugin #{plugin_name} cannot be created: No creation method was specified" unless @creation_method plugin = if @creation_method.arity == 1 @creation_method.call(parent) else @creation_method.call() end extend_plugin(plugin) end
created_plugins()
click to toggle source
# File lib/vizkit/plugin.rb, line 556 def created_plugins @created_plugins end
creation_method(method=nil,&block)
click to toggle source
# File lib/vizkit/plugin.rb, line 453 def creation_method(method=nil,&block) if(method || block) @creation_method = (method || block) if @creation_method.respond_to? :to_sym klass = PluginHelper.class_from_string plugin_name raise "Cannot create class #{plugin_name} to look for creation method #{method}" unless klass if method.to_sym != :new && !klass.method_defined?(method) raise "Class #{plugin_name} has no method called #{method} which is specified as creation method" end @creation_method = klass.method(method) end self else @creation_method end end
extend_plugin(plugin)
click to toggle source
# File lib/vizkit/plugin.rb, line 560 def extend_plugin(plugin) return unless plugin if !plugin.respond_to?:plugin_spec if plugin.instance_variable_defined?:@__plugin_spec raise "Cannot add instance variable @__plugin_spec to plugin #{plugin_name} because it is already defined!" end plugin.instance_variable_set(:@__plugin_spec__,self) def plugin.plugin_spec @__plugin_spec__ end def plugin.pretty_print(pp) pp plugin_spec end else #we have to overwrite it if the widget was created via ui -file #because the ui loader will add a plugin spec plugin.instance_variable_set(:@__plugin_spec__,self) end @extensions.each do |extension| plugin.extend extension end if @on_create_hook @on_create_hook.call(plugin) end @created_plugins << plugin plugin end
extension(mod=nil,&block)
click to toggle source
# File lib/vizkit/plugin.rb, line 449 def extension(mod=nil,&block) extensions(mod || block) end
file_name(name)
click to toggle source
# File lib/vizkit/plugin.rb, line 431 def file_name(name) file_names(name) end
find_all_callback_specs(*pattern)
click to toggle source
# File lib/vizkit/plugin.rb, line 505 def find_all_callback_specs(*pattern) return Array.new if pattern.empty? @callback_specs.find_all do |spec| spec.match?(*pattern) end end
find_all_callbacks(*pattern)
click to toggle source
# File lib/vizkit/plugin.rb, line 535 def find_all_callbacks(*pattern) find_all_callback_specs(*pattern).map do |spec| spec.callback end end
find_callback!(*pattern)
click to toggle source
# File lib/vizkit/plugin.rb, line 541 def find_callback!(*pattern) spec = find_callback_spec!(*pattern) return spec.callback if spec end
find_callback_spec!(*pattern)
click to toggle source
# File lib/vizkit/plugin.rb, line 512 def find_callback_spec!(*pattern) return if pattern.empty? pattern = pattern.first names = PluginHelper.normalize_obj(pattern[:argument]) names << nil if names.empty? pattern = pattern.dup pattern[:exact] = true specs = Array.new names.each do |name| pattern[:argument] = name result = find_all_callback_specs(pattern) if !result.empty? specs = result break end end if specs.size > 1 raise ArgumentError, "Vizkit faild to find the right plugin callback for plugin #{plugin_name} and search pattern #{pattern.inspect}." + " #{specs.size} callbacks were found and vizkit cannot decide which one is right." end specs.first end
match?(*pattern)
click to toggle source
returns true if the plugin matches the given pattern :plugin_name :cplusplus_name :argument if given callback_type must be given as well :callback_type if given argument must be given as well :default if given argument and callback_type must be given as well
# File lib/vizkit/plugin.rb, line 494 def match?(*pattern) return if pattern.empty? pattern = pattern.first pattern, subpattern= Kernel.filter_options pattern,:plugin_name=> nil,:cplusplus_name => nil,:flags =>nil return if pattern[:plugin_name] && plugin_name != pattern[:plugin_name] return if pattern[:cplusplus_name] && cplusplus_name != pattern[:cplusplus_name] return if pattern[:flags] && flags.merge(pattern[:flags]) != flags return if !subpattern.empty? && find_all_callback_specs(subpattern).empty? true end
on_create(&block)
click to toggle source
code block will be called once for each plugin after it was created and extended
# File lib/vizkit/plugin.rb, line 444 def on_create(&block) @on_create_hook = block self end
pretty_print(pp)
click to toggle source
# File lib/vizkit/plugin.rb, line 588 def pretty_print(pp) pp.text "==========================================================" pp.breakable pp.text "Plugin name: #{plugin_name}" pp.breakable pp.text "Plugin type: #{plugin_type}" pp.breakable pp.text "C++ name: #{cplusplus_name}" pp.breakable pp.text "Lib name: #{lib_name}" pp.breakable pp.text "file name(s): #{file_names.join(",")}" pp.breakable if doc pp.text @doc pp.breakable end if !flags.empty? pp.text "Flags:" pp.nest(2) do flags.each_pair do |key,val| pp.breakable pp.text "#{key} => #{val}" end end pp.breakable end pp.text "Extensions: " pp.breakable @extensions.each do |ext| pp.text " Module name: #{ext.name||"Unknown"}" pp.breakable pp.text " Methods:" pp.breakable ext.instance_methods.each do |m| pp.text " #{m.to_s}" pp.breakable end end pp.text "Registered for: " pp.nest(2) do pp.breakable @callback_specs.each do |spec| spec.pretty_print(pp) end end end