Or perhaps even something like:

```ruby
def result_or_error(error, opts)
    -> (result_type) {
      predicates = {
        EXTERNAL: -> (opts) (opts[SOURCE] && opts[TARGET] && opts[PROMPT]),
        HASH: ->(opts) opts.is_a?(Hash)
        LIST: ->(opts) opts.is_a?(Array)
      }
      if opts = result[result_type]
        raise error unless predicate[result_type](opts)
        return result
      end
    }
end
```

... elsewhere ...

```ruby
error = Crichton::TargetMethodResponseError 
if @target.respond_to?(source)
  unless (result = @target.send(source, super)).is_a?(Hash)
    raise error, "#{source} method on target must return Hash object"
  end
  return map(result_or_error(error,opts).call, [EXTERNAL, HASH, LIST])
else
 super
end