# File lib/nice-ffi/library.rb, line 106 def attach_function( methname, arg1, arg2, arg3=nil ) # To match the normal attach_function's weird syntax. # The arguments can be either: # # 1. methname, args, retrn_type (funcname = methname) # 2. methname, funcname, args, retrn_type # funcname, args, retrn_type = if arg1.kind_of?(Array) [methname, arg1, arg2] else [arg1, arg2, arg3] end unless retrn_type.kind_of? NiceFFI::TypedPointer # Normal FFI::Library.attach_function behavior. super else # Create the raw FFI binding, which returns a pointer. # We call it __methname because it's not meant to be called # by users. We also make it private below. # super( "__#{methname}".to_sym, funcname, args, :pointer ) # CAUTION: Metaclass hackery ahead! Handle with care! metaklass = class << self; self; end metaklass.instance_eval { # Create the nice method, which calls __methname and wraps the # return value (a pointer) the appropriate class using # TypedPointer#wrap. This is the one that users should call, # so we don't prepend the name with _'s. # define_method( methname ) do |*args| retrn_type.wrap( send("__#{methname}".to_sym, *args) ) end # __methname is private. private "__#{methname}".to_sym } end end