lib/behaves.rb in behaves-0.1.1 vs lib/behaves.rb in behaves-0.2.0

- old
+ new

@@ -4,29 +4,43 @@ module Behaves def implements(*methods) @behaviors ||= Set.new(methods) end + def inject_behaviors (&block) + @inject_behaviors ||= block + end + def behaves_like(klass) - at_exit do - required = defined_behaviors(klass) + add_injected_behaviors(klass) + at_exit { check_for_unimplemented(klass) } + end - implemented = Set.new(self.instance_methods - Object.instance_methods) + private - unimplemented = required - implemented + def check_for_unimplemented(klass) + required = defined_behaviors(klass) - exit if unimplemented.empty? + implemented = Set.new(self.instance_methods - Object.instance_methods) - raise NotImplementedError, "Expected `#{self}` to behave like `#{klass}`, but `#{unimplemented.to_a.join(', ')}` are not implemented." - end - end + unimplemented = required - implemented - private + 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