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 16 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 8 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 24 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 31 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 82 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 56 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 41 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 72 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 65 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 90 def nearest_decorated_ancestor current = klass current_engine = self ancestors = current.ancestors[1..-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 47 def set_eigenclass_owner eigenclass_engine.owner_class = klass end
Private Instance Methods
# File lib/contracts/engine/base.rb, line 131 def clear_decorators @_decorators = [] end
# File lib/contracts/engine/base.rb, line 107 def decorated_methods @_decorated_methods ||= { :class_methods => {}, :instance_methods => {} } end
# File lib/contracts/engine/base.rb, line 127 def decorators @_decorators ||= [] end
# File lib/contracts/engine/base.rb, line 119 def eigenclass Support.eigenclass_of(klass) end
# File lib/contracts/engine/base.rb, line 123 def eigenclass_engine Eigenclass.lift(eigenclass, klass) end
# File lib/contracts/engine/base.rb, line 115 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 112 def validate! end