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 |