class Xpose::Decorated

Attributes

conf[R]

Public Class Methods

new(**options) click to toggle source
# File lib/xpose/decorated.rb, line 5
def initialize(**options)
  @conf = ::Xpose::Configuration.new(options.merge(permissive: true))
end

Public Instance Methods

value(instance, v) click to toggle source
# File lib/xpose/decorated.rb, line 9
def value(instance, v)
  return v unless shall_decorate?(instance, v)
  if conf.decorator == :infer
    infer(v)
  elsif Class === conf.decorator
    conf.decorator.new(v)
  elsif conf.decorator.respond_to?(:call)
    conf.decorator.call(v)
  elsif Symbol === conf.decorator && class_exists?(klass_from_symbol)
    klass_from_symbol.new(v)
  else
    raise UnknownDecoratorError.new(conf.decorator)
  end
end

Private Instance Methods

class_exists?(class_name) click to toggle source
# File lib/xpose/decorated.rb, line 50
def class_exists?(class_name)
  Module.const_get(class_name.to_s).is_a?(Class)
rescue NameError
  return false
end
infer(v) click to toggle source
# File lib/xpose/decorated.rb, line 32
def infer(v)
  if v.respond_to?(:decorate)
    v.decorate
  elsif class_exists?(klass_from_model)
    klass_from_model.new(v)
  else
    raise UnknownDecoratorError.new(conf.decorator)
  end
end
klass_from_model() click to toggle source
# File lib/xpose/decorated.rb, line 46
def klass_from_model
  "#{conf.model}Decorator".constantize
end
klass_from_symbol() click to toggle source
# File lib/xpose/decorated.rb, line 42
def klass_from_symbol
  conf.decorator.to_s.singularize.capitalize.constantize
end
shall_decorate?(instance, v) click to toggle source
# File lib/xpose/decorated.rb, line 26
def shall_decorate?(instance, v)
  return conf.decorate if [true, false].include?(conf.decorate)
  raise UnknownOptionsError.new(:decorate) unless conf.decorate.respond_to?(:call)
  instance.instance_exec &conf.decorate
end