Sha256: 06a710e7f077cc5202733282193ab4446256cde89c57cae6db7270730609f852

Contents?: true

Size: 764 Bytes

Versions: 1

Compression:

Stored size: 764 Bytes

Contents

require 'behaves/version'
require 'set'

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

  def behaves_like(klass)
    at_exit do
      required = defined_behaviors(klass)

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

      unimplemented = required - implemented

      exit if unimplemented.empty?

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

  private

  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
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
behaves-0.1.1 lib/behaves.rb