class GirFFI::Builders::ModuleBuilder

Builds a module based on information found in the introspection repository.

Public Class Methods

new(namespace, version=nil) click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 13
def initialize namespace, version=nil
  @namespace = namespace
  @version = version
  # FIXME: Pass safe namespace as an argument
  @safe_namespace = @namespace.gsub(/^(.)/) { $1.upcase }
end

Public Instance Methods

build_module() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 47
def build_module
  unless defined? @module
    build_dependencies
    instantiate_module
    setup_lib_for_ffi
    setup_module unless already_set_up
  end
  @module
end
build_namespaced_class(classname) click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 38
def build_namespaced_class classname
  info = gir.find_by_name @namespace, classname.to_s
  if info.nil?
    raise NameError.new(
      "Class #{classname} not found in namespace #{@namespace}")
  end
  Builder.build_class info
end
generate() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 20
def generate
  build_module
end
setup_method(method) click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 24
def setup_method method
  go = function_introspection_data method.to_s

  return false if go.nil?

  modul = build_module

  Builder.attach_ffi_function libmodule, go
  definition = function_definition go
  modul.class_eval definition

  true
end

Private Instance Methods

already_set_up() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 76
def already_set_up
  @module.respond_to? :method_missing
end
build_dependencies() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 59
def build_dependencies
  deps = gir.dependencies @namespace
  deps.each {|dep|
    name, version = dep.split '-'
    Builder.build_module name, version
  }
end
function_definition(info) click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 111
def function_definition info
  FunctionBuilder.new(info).generate
end
function_introspection_data(function) click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 105
def function_introspection_data function
  info = gir.find_by_name @namespace, function.to_s
  return nil if info.nil?
  info.info_type == :function ? info : nil
end
gir() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 115
def gir
  unless defined? @gir
    @gir = GObjectIntrospection::IRepository.default
    @gir.require @namespace, @version
  end
  @gir
end
instantiate_module() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 67
def instantiate_module
  @module = get_or_define_module ::Object, @safe_namespace
end
libmodule() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 101
def libmodule
  @module.const_get(:Lib)
end
setup_lib_for_ffi() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 80
def setup_lib_for_ffi
  @lib = get_or_define_module @module, :Lib

  unless (class << @lib; self.include? GirFFI::Library; end)
    @lib.extend GirFFI::Library
    @lib.ffi_lib_flags :global, :lazy
    libspec = gir.shared_library(@namespace)
    unless libspec.nil?
      @lib.ffi_lib(*libspec.split(/,/))
    end
  end
end
setup_module() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 71
def setup_module
  @module.extend ModuleBase
  @module.const_set :GIR_FFI_BUILDER, self
end
sub_builder(info) click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 93
def sub_builder info
  if info.info_type == :function
    FunctionBuilder.new info
  else
    TypeBuilder.builder_for info
  end
end