Sha256: 8c7fc1a043e851afdd2ddf5232dedbbbf25c6e82e5b0ff1057a0bafbc2f10bde

Contents?: true

Size: 962 Bytes

Versions: 1

Compression:

Stored size: 962 Bytes

Contents

require "libvirt-ruby/version"
require "ffi"

module Libvirt
  module Ruby
    autoload :Exceptions, 'libvirt-ruby/exceptions'

    extend FFI::Library

    def self.method_missing(method, *args)
      args.flatten!
      return_type = args.delete(args.last)
      raise Libvirt::Ruby::Exceptions::NoReturnParameter unless return_type
      dispatcher(method, args, return_type)
    end

    private

    def self.dispatcher(method, args = [], return_type = nil)
      raise Libvirt::Ruby::Exceptions::WrongCall unless not_direct_call?
      begin
        ffi_lib "libvirt"
        attach_function method.to_s, method.to_s, args, return_type
      rescue FFI::NotFoundError
        raise Libvirt::Ruby::Exceptions::InvalidFunction.new(method.to_s)
      rescue LoadError
        raise Libvirt::Ruby::Exceptions::MissingLib
      end
    end

    def self.not_direct_call?
      caller[1][/`.*'/] and caller[1][/`.*'/][1..-2] == 'method_missing'
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
libvirt-ruby-1.0.2 lib/libvirt-ruby.rb