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