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 # module LateBound end # module Aliasing end; end # module RDF::Util