summaryrefslogtreecommitdiffstats
path: root/lib/efl/ffi.rb
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2011-05-01 08:22:00 +0200
committerJérémy Zurcher <jeremy@asynk.ch>2011-05-01 08:22:00 +0200
commit51a6645abd257b37f3248ccf26b1007a7ac88208 (patch)
tree9e90ced4ab2b83af091ca5078d44cabbb7a43050 /lib/efl/ffi.rb
parent314715fd3a8421571ffe77d1a497978011b976fb (diff)
downloadffi-efl-51a6645abd257b37f3248ccf26b1007a7ac88208.zip
ffi-efl-51a6645abd257b37f3248ccf26b1007a7ac88208.tar.gz
cleanup method_missing and [module,prefix] proxies usage and definition
Diffstat (limited to 'lib/efl/ffi.rb')
-rw-r--r--lib/efl/ffi.rb32
1 files changed, 19 insertions, 13 deletions
diff --git a/lib/efl/ffi.rb b/lib/efl/ffi.rb
index bf68e22..0b7416e 100644
--- a/lib/efl/ffi.rb
+++ b/lib/efl/ffi.rb
@@ -68,18 +68,21 @@ module Efl
end
#
module ClassHelper
+ def to_ptr; @ptr; end
+ def === o; @ptr === o.to_ptr; end
+ def address; @ptr.address; end
def self.included kls
- kls.class_eval "def self.search_paths; @search_paths; end"
- kls.class_eval "def self.inherited sub; sub.class_eval 'def self.search_paths; superclass.search_paths; end'; end"
- end
- def to_ptr
- @ptr
- end
- def === o
- @ptr === o.to_ptr
- end
- def address
- @ptr.address
+ # create class instance @proxy_list
+ kls.class_eval "@proxy_list ||=[]"
+ # access and prepend *args to @proxy_list
+ kls.class_eval "def self.proxy_list *args; @proxy_list.unshift *args unless args.empty?; @proxy_list; end"
+ # on inheritance, copy ancestor's @proxy_list
+ kls.class_eval <<-EOF
+ def self.inherited sub
+ sub.class_eval '@proxy_list = []'
+ sub.proxy_list *self.proxy_list
+ end
+ EOF
end
def method_missing m, *args, &block
if m =~/^(.*)=$/
@@ -92,14 +95,17 @@ module Efl
m_s = m.to_s
args_s = '*args'
end
- self.class.search_paths.each do |mod,p|
+ self.class.proxy_list.each do |mod,p|
sym = p+m_s
if mod.respond_to? sym
self.class.class_eval "def #{m} *args, &block; r=#{mod.name}.#{sym}(@ptr,#{args_s}); yield r if block_given?; r; end"
return self.send m, *args, &block
+ elsif mod.respond_to? m
+ self.class.class_eval "def #{m} *args, &block; r=#{mod.name}.#{m}(@ptr,#{args_s}); yield r if block_given?; r; end"
+ return self.send m, *args, &block
end
end
- raise NameError.new "#{self.class} is unable to resolve #{m} into #{self.class.search_paths.inspect}"
+ raise NameError.new "#{self.class} is unable to resolve #{m} within #{self.class.proxy_list.inspect}"
end
end
end