class GirFFI::Builders::ObjectBuilder

Implements the creation of a class representing a GObject Object.

Public Instance Methods

ancestor_infos() click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 51
def ancestor_infos
  @ancestor_infos ||= [info] + info.interfaces + parent_ancestor_infos
end
class_struct_class() click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 38
def class_struct_class
  @class_struct_class ||=
    begin
      parent_struct = parent_builder.class_struct_class
      if class_struct_info
        StructBuilder.new(class_struct_info,
                          superclass: parent_struct).build_class
      else
        parent_struct
      end
    end
end
eligible_properties() click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 55
def eligible_properties
  info.properties.reject do |pinfo|
    info.find_instance_method("get_#{pinfo.name}")
  end
end
find_property(property_name) click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 34
def find_property(property_name)
  seek_in_ancestor_infos { |info| info.find_property property_name }
end
find_signal(signal_name) click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 30
def find_signal(signal_name)
  seek_in_ancestor_infos { |info| info.find_signal signal_name }
end

Private Instance Methods

class_struct_info() click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 73
def class_struct_info
  @class_struct_info ||= info.class_struct
end
define_abstract_initializer() click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 136
      def define_abstract_initializer
        klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1
          def initialize(*)
            raise NoMethodError
          end
        RUBY
      end
define_default_initializer() click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 144
      def define_default_initializer
        klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1
          def initialize(properties = {})
            base_initialize(properties)
          end
        RUBY
      end
define_vfunc_invoker(vfunc_name, invoker_name) click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 116
      def define_vfunc_invoker(vfunc_name, invoker_name)
        return if vfunc_name == invoker_name

        klass.class_eval <<-DEF, __FILE__, __LINE__ + 1
          def #{vfunc_name} *args, &block   # def foo *args, &block
            #{invoker_name}(*args, &block)  #   foo_invoker *args, &block
          end                               # end
        DEF
      end
interfaces() click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 158
def interfaces
  info.interfaces.map do |ifinfo|
    GirFFI::Builder.build_class ifinfo
  end
end
layout_superclass() click to toggle source

FIXME: Private method only used in subclass

# File lib/gir_ffi/builders/object_builder.rb, line 78
def layout_superclass
  GirFFI::Struct
end
parent_ancestor_infos() click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 98
def parent_ancestor_infos
  @parent_ancestor_infos ||= parent_builder.ancestor_infos
end
parent_builder() click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 90
def parent_builder
  @parent_builder ||= if parent_info
                        Builders::TypeBuilder.builder_for(parent_info)
                      else
                        ObjectBaseBuilder.new
                      end
end
parent_info() click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 82
def parent_info
  info.parent
end
seek_in_ancestor_infos() { |info| ... } click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 164
def seek_in_ancestor_infos
  ancestor_infos.each do |info|
    item = yield info
    return item if item
  end
  nil
end
setup_class() click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 63
def setup_class
  setup_layout
  setup_constants
  stub_methods
  setup_property_accessors
  setup_vfunc_invokers
  setup_interfaces
  setup_initializer
end
setup_initializer() click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 126
def setup_initializer
  return if info.find_method "new"

  if info.abstract?
    define_abstract_initializer
  else
    define_default_initializer
  end
end
setup_interfaces() click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 152
def setup_interfaces
  interfaces.each do |iface|
    klass.send :include, iface
  end
end
setup_property_accessors() click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 102
def setup_property_accessors
  eligible_properties.each do |prop|
    PropertyBuilder.new(prop).build
  end
end
setup_vfunc_invokers() click to toggle source

TODO: Guard agains accidental invocation of undefined vfuncs. TODO: Create object responsible for creating these invokers

# File lib/gir_ffi/builders/object_builder.rb, line 110
def setup_vfunc_invokers
  info.vfuncs.each do |vfinfo|
    define_vfunc_invoker vfinfo.name, vfinfo.invoker_name if vfinfo.has_invoker?
  end
end
superclass() click to toggle source
# File lib/gir_ffi/builders/object_builder.rb, line 86
def superclass
  @superclass ||= parent_builder.build_class
end