Extract delegatable

This commit is contained in:
Benjamin Fleischer 2017-05-28 10:38:01 -05:00
parent 94bf22ae2a
commit 793ee3dd11
2 changed files with 40 additions and 19 deletions

37
lib/ams/delegatable.rb Normal file
View File

@ -0,0 +1,37 @@
module AMS
module Delegatable
# delegate constant lookup to Object
def const_missing(name)
::Object.const_get(name)
end
def self.extended(base)
base.class_eval do
# @!visibility private
def send(*args)
__send__(*args)
end
private
def method_missing(name, *args, &block)
object.send(name, *args, &block)
end
def respond_to_missing?(name, include_private = false)
object.respond_to?(name, include_private)
end
const_set(:KERNEL_METHOD_METHOD, ::Kernel.instance_method(:method))
def method_handle_for(method_name)
KERNEL_METHOD_METHOD.bind(self).call(method_name)
rescue NameError => original
handle = self.method(method_name)
raise original unless handle.is_a? Method
handle
end
alias method method_handle_for
end
end
end
end

View File

@ -3,6 +3,7 @@
require "json"
require "ams/inflector"
require "ams/dsl_support"
require "ams/delegatable"
module AMS
# Lightweight mapping of a model to a JSON API resource object
# with attributes and relationships
@ -32,11 +33,8 @@ module AMS
# ums = UserModelSerializer.new(user)
# ums.to_json
class Serializer < BasicObject
extend DSLSupport
# delegate constant lookup to Object
def self.const_missing(name)
::Object.const_get(name)
end
extend ::AMS::DSLSupport
extend ::AMS::Delegatable
class << self
attr_accessor :_attributes, :_relations, :_id_field, :_type
@ -422,16 +420,6 @@ module AMS
JSON.dump(obj)
end
# @!visibility private
def send(*args)
__send__(*args)
end
KERNEL_METHOD_METHOD = ::Kernel.instance_method(:method)
def method(method_name)
KERNEL_METHOD_METHOD.bind(self).call(method_name)
end
private
def link_builder?
@ -467,9 +455,5 @@ module AMS
def foreign_key
"#{object.class.table_name.singularize}_id"
end
def method_missing(name, *args, &block)
object.send(name, *args, &block)
end
end
end