lib/tins/sexy_singleton.rb



require 'tins/string_version'
require 'singleton'

module Tins

  SexySingleton = Singleton.dup

  module SexySingleton
    module SingletonClassMethods
    end
  end

  class << SexySingleton
    alias __old_singleton_included__ included

    if Tins::StringVersion.compare(RUBY_VERSION, :<, "2.7")
      def included(klass)
        __old_singleton_included__(klass)
        (class << klass; self; end).class_eval do
          if Object.method_defined?(:respond_to_missing?)
            def  respond_to_missing?(name, *args)
              instance.respond_to?(name) || super
            end
          else
            def respond_to?(name, *args)
              instance.respond_to?(name) || super
            end
          end

          def method_missing(name, *args, &block)
            if instance.respond_to?(name)
              instance.__send__(name, *args, &block)
            else
              super
            end
          end
        end
        super
      end
    else
      def included(klass)
        __old_singleton_included__(klass)
        (class << klass; self; end).class_eval do
          if Object.method_defined?(:respond_to_missing?)
            def  respond_to_missing?(name, *args, **kwargs)
              instance.respond_to?(name) || super
            end
          else
            def respond_to?(name, *args, **kwargs)
              instance.respond_to?(name) || super
            end
          end

          def method_missing(name, *args, **kwargs, &block)
            if instance.respond_to?(name)
              instance.__send__(name, *args, **kwargs, &block)
            else
              super
            end
          end
        end
        super
      end
    end
  end
end