diff --git a/lib/representable/deserializer.rb b/lib/representable/deserializer.rb index e67d4100..744f1d48 100644 --- a/lib/representable/deserializer.rb +++ b/lib/representable/deserializer.rb @@ -88,8 +88,18 @@ module CreateObject end Setter = ->(input, options) { options[:binding].evaluate_option(:setter, input, options) } - SetValue = ->(input, options) { options[:binding].send(:exec_context, options).send(options[:binding].setter, input) } + SetValue = ->(input, options) do + context = options[:binding].send(:exec_context, options) + + arguments = [input] + arguments << { + options: options[:options], + user_options: options[:options][:user_options] + } if !context.is_a?(OpenStruct) && context.method(options[:binding].setter).arity == 2 + + context.send(options[:binding].setter, *arguments) + end Stop = ->(*) { Pipeline::Stop } @@ -105,4 +115,4 @@ module CreateObject return input if options[:options][:exclude]&&!res Pipeline::Stop end -end \ No newline at end of file +end diff --git a/lib/representable/serializer.rb b/lib/representable/serializer.rb index 5178544d..52c39603 100644 --- a/lib/representable/serializer.rb +++ b/lib/representable/serializer.rb @@ -3,7 +3,18 @@ module Representable options[:binding].evaluate_option(:getter, input, options) end - GetValue = ->(input, options) { options[:binding].send(:exec_context, options).send(options[:binding].getter) } + GetValue = ->(input, options) do + context = options[:binding].send(:exec_context, options) + return options[:binding].send(:exec_context, options).send(options[:binding].getter) unless context + + arguments = [] + arguments << { + options: options[:options], + user_options: options[:options][:user_options] + } if !context.is_a?(OpenStruct) && context.method(options[:binding].getter).arity == 1 + + context.send(options[:binding].getter, *arguments) + end Writer = ->(input, options) do options[:binding].evaluate_option(:writer, input, options) @@ -51,4 +62,4 @@ module Representable # Warning: don't rely on AssignAs/AssignName, i am not sure if i leave that as functions. AssignAs = ->(input, options) { options[:as] = As.(input, options); input } AssignName = ->(input, options) { options[:as] = options[:binding].name; input } -end \ No newline at end of file +end