class DesignByContract::Pattern::DependencyInjection

Public Class Methods

new(target_class, initialize_signature_spec) click to toggle source
# File lib/design_by_contract/pattern/dependency_injection.rb, line 2
def initialize(target_class, initialize_signature_spec)
  @target_class = target_class
  @signature = DesignByContract::Signature.new(initialize_signature_spec)
  @teardowns = []
end

Public Instance Methods

down() click to toggle source
# File lib/design_by_contract/pattern/dependency_injection.rb, line 13
def down
  @teardowns.each(&:call)
  @teardowns.clear
end
up() click to toggle source
# File lib/design_by_contract/pattern/dependency_injection.rb, line 8
def up
  validate_initialize_method_signature
  add_on_call_validation_hook
end

Private Instance Methods

add_on_call_validation_hook() click to toggle source
Calls superclass method
# File lib/design_by_contract/pattern/dependency_injection.rb, line 20
def add_on_call_validation_hook
  initialize_checker = Module.new
  signature = @signature

  initialize_checker.module_eval do
    define_method(:initialize) do |*args|
      raise(ArgumentError, 'argument signature missmatch') unless signature.valid?(*args)

      super(*args) if defined?(super)
    end
  end

  @target_class.__send__(:prepend, initialize_checker)
  @teardowns << lambda{ initialize_checker.__send__(:remove_method, :initialize) }
end
validate_initialize_method_signature() click to toggle source

TODO: signature inspect

# File lib/design_by_contract/pattern/dependency_injection.rb, line 37
def validate_initialize_method_signature
  unless @signature.match?(@target_class.instance_method(:initialize))
    raise(NotImplementedError, ':initialize method signature mismatch')
  end
rescue NameError
  unless @signature.empty?
    error_message = ":initialize method is not implemented, but contract requires one for #{@target_class}"

    raise(NotImplementedError, error_message)
  end
end