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