Sha256: 4f080eccd6808007c493b3b0ca4ac22e5c9fbd83f20494fd97c8ec5a74c93b20

Contents?: true

Size: 1.09 KB

Versions: 10

Compression:

Stored size: 1.09 KB

Contents

class Class

  # Prepend an "aspect module" to a class.
  #
  #   class Firetruck
  #     def put_out_fire(option)
  #       "Put out #{option}"
  #     end
  #   end
  #
  #   module FastFiretruck
  #     def put_out_fire(option)
  #       super("very #{option}!")
  #     end
  #   end
  #
  #   Firetruck.prepend(FastFiretruck)
  #
  #   ft = Firetruck.new
  #   ft.put_out_fire('fast') #=> "Put out very fast!"
  #
  # Implementation of this method has some limitations,
  # in that it works by overriding #new and #allocate.
  #
  # CREDIT: Trans
  #
  # TODO: Perhaps rename this to preallocate, b/c of
  # the way it works. It is not really a clean
  # prepend, like that of Module#prepend.
  def prepend( aspect )
    _new      = method(:new)
    _allocate = method(:allocate)
    (class << self; self; end).class_eval do
      define_method(:new) do |*args|
        o = _new.call(*args)
        o.extend aspect
        o
      end
      define_method(:allocate) do |*args|
        o = _allocate.call(*args)
        o.extend aspect
        o
      end
    end
  end

  #alias_method :preallocate, :prepend
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
facets-2.8.4 lib/core/facets/class/prepend.rb
facets-2.8.3 lib/core/facets/class/prepend.rb
facets-2.8.2 lib/core/facets/class/prepend.rb
facets-2.8.1 lib/core/facets/class/prepend.rb
facets-2.8.0 lib/core/facets/class/prepend.rb
facets-2.7.0 lib/core/facets/class/prepend.rb
facets-2.6.0 lib/core/facets/class/prepend.rb
facets-2.5.0 lib/core/facets/class/prepend.rb
facets-2.5.1 lib/core/facets/class/prepend.rb
facets-2.5.2 lib/core/facets/class/prepend.rb