Sha256: a60affb89618188f5337ec7b738b39312c1dfbfa31796995ae358e85ebdeb060

Contents?: true

Size: 1.1 KB

Versions: 1

Compression:

Stored size: 1.1 KB

Contents

require 'behaves/version'
require 'set'

module Behaves
  def implements(*methods)
    @behaviors ||= Set.new(methods)
  end

  def inject_behaviors (&block)
    @inject_behaviors ||= block
  end

  def behaves_like(klass)
    add_injected_behaviors(klass)
    at_exit { check_for_unimplemented(klass) }
  end

  private

  def check_for_unimplemented(klass)
    required = defined_behaviors(klass)

    implemented = Set.new(self.instance_methods - Object.instance_methods)

    unimplemented = required - implemented

    return if unimplemented.empty?

    raise NotImplementedError, "Expected `#{self}` to behave like `#{klass}`, but `#{unimplemented.to_a.join(', ')}` are not implemented."
  end

  def defined_behaviors(klass)
    if behaviors = klass.instance_variable_get("@behaviors")
      behaviors
    else
      raise NotImplementedError, "Expected `#{klass}` to define behaviors, but none found."
    end
  end

  def add_injected_behaviors(klass)
    injected_behaviors = klass.instance_variable_get("@inject_behaviors")
    if injected_behaviors
      self.class_eval &injected_behaviors
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
behaves-0.2.0 lib/behaves.rb