Class: GObjectIntrospection::Loader::VirtualFunctionImplementor
- Inherits:
-
Object
- Object
- GObjectIntrospection::Loader::VirtualFunctionImplementor
- Defined in:
- lib/gobject-introspection/loader.rb
Instance Method Summary collapse
- #implement(implementor_gtype, name) ⇒ Object
-
#initialize(loader_class, gtype_prefix, infos) ⇒ VirtualFunctionImplementor
constructor
A new instance of VirtualFunctionImplementor.
Constructor Details
#initialize(loader_class, gtype_prefix, infos) ⇒ VirtualFunctionImplementor
Returns a new instance of VirtualFunctionImplementor.
837 838 839 840 841 842 843 844 845 846 847 |
# File 'lib/gobject-introspection/loader.rb', line 837 def initialize(loader_class, gtype_prefix, infos) @loader_class = loader_class @gtype_prefix = gtype_prefix @infos = {} prefix = GLib::VIRTUAL_FUNCTION_IMPLEMENTATION_PREFIX infos.each do |info| name = info.name @infos[:"#{prefix}#{name}"] = info @infos[:"#{prefix}#{gtype_prefix}_#{name}"] = info end end |
Instance Method Details
#implement(implementor_gtype, name) ⇒ Object
849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 |
# File 'lib/gobject-introspection/loader.rb', line 849 def implement(implementor_gtype, name) info = @infos[name] return false if info.nil? container = info.container vtable_gtype = container.gtype if container.respond_to?(:class_struct) struct = container.class_struct # This is for "super" in "virtual_do_XXX". parent_gtype = implementor_gtype.parent parent_class = parent_gtype.to_class invoker = Invoker.new(info, name, "#{parent_class.name}\##{name}") parent_vfunc_callable = Module.new parent_vfunc_callable.define_method(name) do |*args, &block| invoker.invoke(self, args, block, implementor_gtype: parent_gtype) end # If we use implementor_gtype.class.include here, # GLib::Instantiatable.include calls this method # recursively. We don't need to call any hook for this # method. So we use the original Module.include here. Module.method(:include).unbind.bind_call(implementor_gtype.to_class, parent_vfunc_callable) else return false unless implementor_gtype.type_is_a?(vtable_gtype) struct = container.iface_struct end field = struct.find_field(info.name) @loader_class.implement_virtual_function(field, implementor_gtype, vtable_gtype, name.to_s) true end |