Module: Mirah::Util

Defined in:
lib/mirah/util/delegate.rb,
lib/mirah/util/class_loader.rb,
lib/mirah/util/process_errors.rb,
lib/mirah/util/compilation_state.rb,
lib/mirah/util/argument_processor.rb

Defined Under Namespace

Modules: ProcessErrors Classes: ArgumentProcessor, CompilationState, Delegator

Constant Summary collapse

ClassLoader =
Java::OrgMirah::MirahClassLoader
IsolatedResourceLoader =
Java::OrgMirah::IsolatedResourceLoader

Class Method Summary collapse

Class Method Details

.DelegateClass(superclass) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/mirah/util/delegate.rb', line 9

def self.DelegateClass(superclass)
  klass = Class.new
  methods = superclass.public_instance_methods(true).map(&:to_s)
  methods -= ::Kernel.public_instance_methods(false).map(&:to_s)
  methods -= ["__id__", "__send__"] if RUBY_VERSION > '1.9' # avoid warnings
  methods |= ["to_s","to_a","inspect","==","=~","==="]
  klass.module_eval {
    def initialize(obj)  # :nodoc:
      @_dc_obj = obj
    end
    def method_missing(m, *args)  # :nodoc:
      unless @_dc_obj.respond_to?(m)
        super(m, *args)
      end
      @_dc_obj.__send__(m, *args)
    end
    def respond_to?(m, include_private = false)  # :nodoc:
      return true if super
      return @_dc_obj.respond_to?(m, include_private)
    end
    def __getobj__  # :nodoc:
      @_dc_obj
    end
    def __setobj__(obj)  # :nodoc:
      raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
      @_dc_obj = obj
    end
    def clone  # :nodoc:
      new = super
      new.__setobj__(__getobj__.clone)
      new
    end
    def dup  # :nodoc:
      new = super
      new.__setobj__(__getobj__.clone)
      new
    end
  }
  for method in methods
    begin
      klass.module_eval <<-EOS, __FILE__, __LINE__+1
        def #{method}(*args, &block)
        	  begin
        	    @_dc_obj.__send__(:#{method}, *args, &block)
        	  ensure
        	    [email protected]_if{|s| ::Mirah::Util::Delegator::IgnoreBacktracePat =~ s} if $@
        	  end
        	end
      EOS
    rescue SyntaxError
      raise NameError, "invalid identifier %s" % method, caller(3)
    end
  end
  return klass
end