ruby-rdf/rdf

View on GitHub
lib/rdf/util/aliasing.rb

Summary

Maintainability
A
0 mins
Test Coverage
module RDF; module Util
  module Aliasing
    ##
    # Helpers for late-bound instance method aliasing.
    #
    # Anything that extends this module will obtain an `alias_method` class
    # method that creates late-bound instance method aliases instead of the
    # default early-bound aliases created by Ruby's `Module#alias_method`.
    #
    # This is useful because RDF.rb mixins typically alias a number of
    # overridable methods. For example, `RDF::Enumerable#count` has the
    # aliases `#size` and `#length`. Normally if implementing classes were
    # to override the default method, the aliased methods would still be
    # bound to the mixin's original reference implementation rather than the
    # new overridden method. Mixing in this module into the implementing
    # class fixes this problem.
    #
    # @example Using late-bound aliasing in a module
    #   module MyModule
    #     extend RDF::Util::Aliasing::LateBound
    #   end
    #
    # @example Using late-bound aliasing in a class
    #   class MyClass
    #     extend RDF::Util::Aliasing::LateBound
    #   end
    #
    # @see   http://en.wikipedia.org/wiki/Name_binding
    # @since 0.2.0
    module LateBound
      ##
      # Makes `new_name` a late-bound alias of the method `old_name`.
      #
      # @example Aliasing the `#count` method to `#size` and `#length`
      #   alias_method :size,   :count
      #   alias_method :length, :count
      #
      # @param  [Symbol, #to_sym] new_name
      # @param  [Symbol, #to_sym] old_name
      # @return [void]
      # @see    http://ruby-doc.org/core/classes/Module.html#M001653
      def alias_method(new_name, old_name)
        new_name, old_name = new_name.to_sym, old_name.to_sym

        self.__send__(:define_method, new_name) do |*args, &block|
          __send__(old_name, *args, &block)
        end

        return self
      end
    end # LateBound
  end # Aliasing
end; end # RDF::Util