Module: Interface

Defined in:
lib/interface.rb,
lib/interface/version.rb

Defined Under Namespace

Modules: Abstract, ClassMethods

Constant Summary collapse

UnknownInterface =
Class.new(StandardError)
VERSION =
"0.1.1"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



27
28
29
# File 'lib/interface.rb', line 27

def self.included(base)
  base.extend ClassMethods
end

Instance Method Details

#as(interface) ⇒ Object

Raises:



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/interface.rb', line 56

def as(interface)
  raise UnknownInterface.new(interface) unless self.class.interfaces.include?(interface)
  Class.new do
    def initialize(target)
      @target = target
    end

    interface.instance_methods.select do |method|
      interface.instance_method(method.to_sym).owner == interface
    end.each do |method|
      define_method(method) do |*args, &block|
        @target.public_send(method, *args, &block)
      end
    end

    [:is_a?, :kind_of?, :instance_of?].each do |type_method|
      define_method(type_method) do |target, &block|
        return true if target == interface
        super
      end
    end

    define_method(:inspect) do
      "#<#{interface.name}:#{self.object_id}>"
    end

    def to_s
      inspect
    end
  end.new(self)
end