lib/verbalize.rb in verbalize-1.0.1 vs lib/verbalize.rb in verbalize-1.1.1

- old
+ new

@@ -1,15 +1,17 @@ require 'verbalize/version' require 'verbalize/build_initialize_method' -require 'verbalize/build_action_method' +require 'verbalize/build_safe_action_method' +require 'verbalize/build_dangerous_action_method' require 'verbalize/build_attribute_readers' require 'verbalize/result' module Verbalize - def fail!(failure_value) - @verbalize_outcome = :error - throw :verbalize_error, failure_value + VerbalizeError = Class.new(StandardError) + + def fail!(failure_value = nil) + throw(:verbalize_error, Result.new(outcome: :error, value: failure_value)) end def self.included(target) target.extend ClassMethods end @@ -34,16 +36,22 @@ ) end optional_keywords = Array(optional) - class_eval BuildActionMethod.call( + class_eval BuildSafeActionMethod.call( required_keywords: required_keywords, optional_keywords: optional_keywords, method_name: method_name ) + class_eval BuildDangerousActionMethod.call( + required_keywords: required_keywords, + optional_keywords: optional_keywords, + method_name: method_name + ) + class_eval BuildInitializeMethod.call( required_keywords: required_keywords, optional_keywords: optional_keywords ) @@ -51,12 +59,24 @@ attributes: required_keywords + optional_keywords ) end def call - action = new - value = catch(:verbalize_error) { action.send(:call) } - outcome = action.instance_variable_get(:@verbalize_outcome) || :ok - Result.new(outcome: outcome, value: value) + action = new + result = catch(:verbalize_error) { action.send(:call) } + if result.is_a?(Result) + result + else + Result.new(outcome: :ok, value: result) + end + end + + def call! + new.send(:call) + rescue UncaughtThrowError => uncaught_throw_error + fail_value = uncaught_throw_error.value.last + error = VerbalizeError.new("Unhandled fail! called with: #{fail_value.inspect}.") + error.set_backtrace(uncaught_throw_error.backtrace[2..-1]) + raise error end end end