lib/verbalize.rb in verbalize-1.2.0 vs lib/verbalize.rb in verbalize-1.3.0
- old
+ new
@@ -4,14 +4,15 @@
require 'verbalize/build_dangerous_action_method'
require 'verbalize/build_attribute_readers'
require 'verbalize/result'
module Verbalize
+ THROWN_SYMBOL = :verbalize_error
VerbalizeError = Class.new(StandardError)
def fail!(failure_value = nil)
- throw(:verbalize_error, Result.new(outcome: :error, value: failure_value))
+ throw(THROWN_SYMBOL, failure_value)
end
def self.included(target)
target.extend ClassMethods
end
@@ -59,22 +60,33 @@
attributes: required_keywords + optional_keywords
)
end
def call
- action = new
- result = catch(:verbalize_error) { action.send(:call) }
- if result.is_a?(Result)
- result
- else
- Result.new(outcome: :ok, value: result)
- end
+ __verbalized_send(:call)
end
def call!
- new.send(:call)
+ __verbalized_send!(:call)
+ end
+
+ private
+
+ def __verbalized_send(method_name, *args)
+ outcome = :error
+ value = catch(:verbalize_error) do
+ value = new(*args).send(method_name)
+ # The outcome is :ok if the call didn't throw.
+ outcome = :ok
+ value
+ end
+ Result.new(outcome: outcome, value: value)
+ end
+
+ def __verbalized_send!(method_name, *args)
+ new(*args).send(method_name)
rescue UncaughtThrowError => uncaught_throw_error
- fail_value = uncaught_throw_error.value.value
+ fail_value = uncaught_throw_error.value
error = VerbalizeError.new("Unhandled fail! called with: #{fail_value.inspect}.")
error.set_backtrace(uncaught_throw_error.backtrace[2..-1])
raise error
end
end