module Lexicon::Common::Mixin::Finalizable

Public Class Methods

included(base) click to toggle source
# File lib/lexicon/common/mixin/finalizable.rb, line 5
def self.included(base)
  class << base
    alias_method :_new, :new

    def new(*args, **options)
      e = do_call(self, '_new', args, options)

      ObjectSpace.define_finalizer(e, e.method(:_finalize))

      e
    end

    # Empty Array and Hash splats are handled correctly starting ruby 2.7:
    # if both args and kwargs are empty, no parameters are sent.
    if ::Semantic::Version.new(RUBY_VERSION).satisfies?('>= 2.7.0')
      private def do_call(obj, method, args, kwargs)
        obj.send(method, *args, **kwargs)
      end
    else
      private def do_call(obj, method, args, kwargs)
        if args.empty? && kwargs.empty?
          obj.send(method)
        elsif args.empty?
          obj.send(method, **kwargs)
        elsif kwargs.empty?
          obj.send(method, *args)
        else
          obj.send(method, *args, **kwargs)
        end
      end
    end
  end
end

Private Instance Methods

_finalize(_id) click to toggle source
# File lib/lexicon/common/mixin/finalizable.rb, line 45
def _finalize(_id)
  m = method(:finalize)

  if !m.nil?
    finalize
  end
rescue StandardError => e
  puts "Exception in finalizer: #{e.message}\n" + e.backtrace.join("\n")
end
finalize() click to toggle source
# File lib/lexicon/common/mixin/finalizable.rb, line 41
def finalize
  raise StandardError.new("Finalizer is not implemented in #{self.class.name}")
end