Module: RubyInterface

Defined in:
lib/ruby_interface.rb,
lib/ruby-interface/version.rb

Defined Under Namespace

Classes: InterfaceClass

Constant Summary collapse

VERSION =
"0.0.6"

Instance Method Summary collapse

Instance Method Details

#interface(method_name, &interface_body) ⇒ Object



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
# File 'lib/ruby_interface.rb', line 6

def interface(method_name, &interface_body)
  mod_inst = self.const_set("#{method_name.to_s.camelize}InstanceMethods", Module.new)
  mod_inst.module_eval <<-EOT, __FILE__, __LINE__ + 1
    def #{method_name}
      @#{method_name}_interface ||= self.class.#{method_name}_interface.new(self)
    end                                                             
    EOT


  mod_class = self.const_set("#{method_name.to_s.camelize}ClassMethods", Module.new)
  mod_class.module_eval <<-EOT, __FILE__, __LINE__ + 1
    def #{method_name}(&blk)
      self.#{method_name}_interface.class_eval(&blk) if blk
      self.#{method_name}_interface
    end

    def inherited(subclass)
      new_class = subclass.const_set("#{method_name.to_s.camelize}InterfaceClass", Class.new(self.#{method_name}_interface))
      new_class.interface_base = subclass
      subclass.#{method_name}_interface = new_class
      super
    end
    EOT

  interface_module = self
  
  add_interface do |base|
    base.send(:class_attribute, "#{method_name}_interface")
    interface_class = base.const_set("#{method_name.to_s.camelize}InterfaceClass", Class.new(RubyInterface::InterfaceClass))
    interface_class.interface_base = base
    interface_class.class_eval(&interface_body) if interface_body
    base.send("#{method_name}_interface=", interface_class)
    base.extend mod_class
    base.send :include, mod_inst
    base.class_eval(&interface_class.interfaced) if interface_class.interfaced
  end

  interface_module.define_singleton_method(:included) do |base|
    @_deps.each {|d| d.call(base)}
  end
end