class Contracts::Engine::Base

Contracts engine

Attributes

klass[R]

Public Class Methods

applied?(klass) click to toggle source

Returns true if klass has contracts engine

@param [Class] klass - target class @return [Bool]

# File lib/contracts/engine/base.rb, line 18
def self.applied?(klass)
  Engine::Target.new(klass).applied?
end
apply(klass) click to toggle source

Enable contracts engine for klass

@param [Class] klass - target class

# File lib/contracts/engine/base.rb, line 10
def self.apply(klass)
  Engine::Target.new(klass).apply
end
fetch_from(klass) click to toggle source

Fetches contracts engine out of klass

@param [Class] klass - target class @return [Engine::Base or Engine::Eigenclass]

# File lib/contracts/engine/base.rb, line 26
def self.fetch_from(klass)
  Engine::Target.new(klass).engine
end
new(klass) click to toggle source

Creates new instance of contracts engine

@param [Class] klass - class that owns this engine

# File lib/contracts/engine/base.rb, line 33
def initialize(klass)
  @klass = klass
end

Public Instance Methods

add_method_decorator(type, name, decorator) click to toggle source

Adds method decorator

@param [Or[:class_methods, :instance_methods]] type - method type @param [Symbol] name - method name @param [Decorator] decorator - method decorator

# File lib/contracts/engine/base.rb, line 84
def add_method_decorator(type, name, decorator)
  decorated_methods[type][name] ||= []
  decorated_methods[type][name] << decorator
end
all_decorators() click to toggle source

Fetches all accumulated decorators (both this engine and corresponding eigenclass' engine) It clears all accumulated decorators

@return [ArrayOf]

# File lib/contracts/engine/base.rb, line 58
def all_decorators
  pop_decorators + eigenclass_engine.all_decorators
end
decorate(decorator_class, *args) click to toggle source

Adds provided decorator to the engine It validates that decorator can be added to this engine at the moment

@param [Decorator:Class] decorator_class @param args - arguments for decorator

# File lib/contracts/engine/base.rb, line 43
def decorate(decorator_class, *args)
  validate!
  decorators << [decorator_class, args]
end
decorated_methods?() click to toggle source

Returns true if there are any decorated methods

@return [Bool]

# File lib/contracts/engine/base.rb, line 74
def decorated_methods?
  !decorated_methods[:class_methods].empty? ||
    !decorated_methods[:instance_methods].empty?
end
decorated_methods_for(type, name) click to toggle source

Fetches decorators of specified type for method with name

@param [Or[:class_methods, :instance_methods]] type - method type @param [Symbol] name - method name @return [ArrayOf]

# File lib/contracts/engine/base.rb, line 67
def decorated_methods_for(type, name)
  Array(decorated_methods[type][name])
end
nearest_decorated_ancestor() click to toggle source

Returns nearest ancestor's engine that has decorated methods

@return [Engine::Base or Engine::Eigenclass]

# File lib/contracts/engine/base.rb, line 92
def nearest_decorated_ancestor
  current = klass
  current_engine = self
  ancestors = current.ancestors[1..]

  while current && current_engine && !current_engine.decorated_methods?
    current = ancestors.shift
    current_engine = Engine.fetch_from(current)
  end

  current_engine
end
set_eigenclass_owner() click to toggle source

Sets eigenclass' owner to klass

# File lib/contracts/engine/base.rb, line 49
def set_eigenclass_owner
  eigenclass_engine.owner_class = klass
end

Private Instance Methods

clear_decorators() click to toggle source
# File lib/contracts/engine/base.rb, line 132
def clear_decorators
  @_decorators = []
end
decorated_methods() click to toggle source
# File lib/contracts/engine/base.rb, line 109
def decorated_methods
  @_decorated_methods ||= { :class_methods => {}, :instance_methods => {} }
end
decorators() click to toggle source
# File lib/contracts/engine/base.rb, line 128
def decorators
  @_decorators ||= []
end
eigenclass() click to toggle source
# File lib/contracts/engine/base.rb, line 120
def eigenclass
  Support.eigenclass_of(klass)
end
eigenclass_engine() click to toggle source
# File lib/contracts/engine/base.rb, line 124
def eigenclass_engine
  Eigenclass.lift(eigenclass, klass)
end
pop_decorators() click to toggle source
# File lib/contracts/engine/base.rb, line 116
def pop_decorators
  decorators.tap { clear_decorators }
end
validate!() click to toggle source

No-op because it is safe to add decorators to normal classes

# File lib/contracts/engine/base.rb, line 114
def validate!; end