namespace.rb

Ruby code posted by zimbatm
created at 04 Dec 12:41

Edit | Back
1
2
3
4
5
6
7
8
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
class Module
  # BasicObject is used to limit the size of the exposed interface
  class Instance < BasicObject
    def initialize(mod, &fixes)
      # BasicObject doesn't expose #extend and #singleton_class
      (class << self; self; end).instance_eval do
        include(mod)
        instance_eval(&fixes) if block_given?
      end
    end
  end

  module Namespace
    # Exposes a module +mod+ under a given +name+.
    #
    # +fixes+ is executed under the context of the exposed module and useful
    # for tweaking the visibility of old modules.
    def import(name, mod, &fixes)
      instance = Instance.new(mod, &fixes)
      define_method(name) { instance }
      protected(name)
    end
  end

  include Namespace
end

if __FILE__ == $0
  module ExampleNamespace
    def foo; "foo"; end
  end

  class Bar
    import "ex", ExampleNamespace
    import "math", Math do
      public :sqrt
    end

    def is_it_working?
      ex.foo == "foo" && math.sqrt(4) == 2.0
    end
  end

  b = Bar.new
  p [:working?, b.is_it_working?]
end
1.06 KB in 3 ms with coderay