Class: Accord::InterfaceClass

Inherits:
Specification show all
Defined in:
lib/accord/interface.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Specification

#ancestors, #bases, #bases=, #extends?, #interfaces

Constructor Details

#initialize(name, bases = []) ⇒ InterfaceClass

Returns a new instance of InterfaceClass.



65
66
67
68
# File 'lib/accord/interface.rb', line 65

def initialize(name, bases=[])
  super(bases)
  @name = name.to_s
end

Instance Attribute Details

#docObject

Returns the value of attribute doc.



63
64
65
# File 'lib/accord/interface.rb', line 63

def doc
  @doc
end

Instance Method Details

#[](name) ⇒ Object



128
129
130
131
# File 'lib/accord/interface.rb', line 128

def [](name)
  owner = iro.detect { |i| i.owns?(name) }
  owner.members[name] if owner
end

#adapt(*objects) ⇒ Object



86
87
88
89
90
91
92
# File 'lib/accord/interface.rb', line 86

def adapt(*objects)
  Accord.adapter_hooks.each do |hook|
    result = hook.call(self, *objects)
    return result if result
  end
  nil
end

#adapt!(*objects) ⇒ Object



94
95
96
97
98
# File 'lib/accord/interface.rb', line 94

def adapt!(*objects)
  adapt(*objects).tap do |result|
    raise TypeError, "could not adapt: #{objects.inspect}" if result.nil?
  end
end

#assert_invariants(object, errors = nil) ⇒ Object

Raises:



154
155
156
# File 'lib/accord/interface.rb', line 154

def assert_invariants(object, errors=nil)
  raise Invalid unless assert_invariants?(object, errors)
end

#assert_invariants?(object, errors = nil) ⇒ Boolean

Returns:

  • (Boolean)


147
148
149
150
151
152
# File 'lib/accord/interface.rb', line 147

def assert_invariants?(object, errors=nil)
  errors ||= []
  (iro - [self]).each { |i| i.assert_invariants?(object, errors) }
  invariants.run(object, errors)
  errors.empty?
end

#defined?(name) ⇒ Boolean

Returns:

  • (Boolean)


133
134
135
# File 'lib/accord/interface.rb', line 133

def defined?(name)
  iro.any? { |i| i.owns?(name) }
end

#eachObject



141
142
143
144
145
# File 'lib/accord/interface.rb', line 141

def each
  member_names.each do |name|
    yield(name, self[name])
  end
end

#each_interface {|_self| ... } ⇒ Object

Yields:

  • (_self)

Yield Parameters:



74
75
76
# File 'lib/accord/interface.rb', line 74

def each_interface
  yield(self)
end

#implemented_by?(cls_or_mod) ⇒ Boolean

Returns:

  • (Boolean)


104
105
106
# File 'lib/accord/interface.rb', line 104

def implemented_by?(cls_or_mod)
  Accord::Declarations.implemented_by(cls_or_mod).extends?(self)
end

#inspectObject



82
83
84
# File 'lib/accord/interface.rb', line 82

def inspect
  "<Interface #{name}>"
end

#invariantsObject



112
113
114
# File 'lib/accord/interface.rb', line 112

def invariants
  @invariants ||= InterfaceInvariants.new(self)
end

#iroObject



78
79
80
# File 'lib/accord/interface.rb', line 78

def iro
  @iro ||= ancestors.select { |spec| spec.is_a?(InterfaceClass) }
end

#member_namesObject



116
117
118
119
120
121
122
# File 'lib/accord/interface.rb', line 116

def member_names
  iro.reverse.each_with_object([]) do |i, names|
    i.members.names.each do |name|
      names << name unless names.include?(name)
    end
  end
end

#membersObject



108
109
110
# File 'lib/accord/interface.rb', line 108

def members
  @members ||= InterfaceMembers.new(self)
end

#nameObject



70
71
72
# File 'lib/accord/interface.rb', line 70

def name
  @name
end

#own_member_namesObject



124
125
126
# File 'lib/accord/interface.rb', line 124

def own_member_names
  members.names
end

#owns?(name) ⇒ Boolean

Returns:

  • (Boolean)


137
138
139
# File 'lib/accord/interface.rb', line 137

def owns?(name)
  members.added?(name)
end

#provided_by?(object) ⇒ Boolean

Returns:

  • (Boolean)


100
101
102
# File 'lib/accord/interface.rb', line 100

def provided_by?(object)
  Accord::Declarations.provided_by(object).extends?(self)
end

#tagsObject



158
159
160
# File 'lib/accord/interface.rb', line 158

def tags
  @tags ||= Tags.new
end

#verify_module(mod) ⇒ Object

Raises:



171
172
173
174
175
176
177
178
# File 'lib/accord/interface.rb', line 171

def verify_module(mod)
  raise DoesNotImplement.new(self) unless implemented_by?(mod)

  each do |name, member|
    raise BrokenImplementation.new(self, name) unless \
      member.compatible_with_module?(mod)
  end
end

#verify_object(object) ⇒ Object

Raises:



162
163
164
165
166
167
168
169
# File 'lib/accord/interface.rb', line 162

def verify_object(object)
  raise DoesNotImplement.new(self) unless provided_by?(object)

  each do |name, member|
    raise BrokenImplementation.new(self, name) unless \
      member.compatible_with_object?(object)
  end
end