diff --git a/lib/ams/delegatable.rb b/lib/ams/delegatable.rb new file mode 100644 index 00000000..4ef27bda --- /dev/null +++ b/lib/ams/delegatable.rb @@ -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 diff --git a/lib/ams/serializer.rb b/lib/ams/serializer.rb index 81c925c1..f6671b20 100644 --- a/lib/ams/serializer.rb +++ b/lib/ams/serializer.rb @@ -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