class Contracts::Engine::Base
Contracts
engine
Attributes
Public Class Methods
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
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
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
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
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
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
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
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
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
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
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
# File lib/contracts/engine/base.rb, line 132 def clear_decorators @_decorators = [] end
# File lib/contracts/engine/base.rb, line 109 def decorated_methods @_decorated_methods ||= { :class_methods => {}, :instance_methods => {} } end
# File lib/contracts/engine/base.rb, line 128 def decorators @_decorators ||= [] end
# File lib/contracts/engine/base.rb, line 120 def eigenclass Support.eigenclass_of(klass) end
# File lib/contracts/engine/base.rb, line 124 def eigenclass_engine Eigenclass.lift(eigenclass, klass) end
# File lib/contracts/engine/base.rb, line 116 def pop_decorators decorators.tap { clear_decorators } end
No-op because it is safe to add decorators to normal classes
# File lib/contracts/engine/base.rb, line 114 def validate!; end