Sha256: 2d6e818505eb6ecc03cd839af9f505e41e56141f6107dfe8867923f362ccade1
Contents?: true
Size: 1.58 KB
Versions: 12
Compression:
Stored size: 1.58 KB
Contents
require 'facets/more/functor.rb' module Kernel # Returns a Functor that allows one to call any parent method directly. # # class A # def x ; 1 ; end # end # # class B < A # def x ; 2 ; end # end # # class C < B # def x ; as(A).x ; end # end # # C.new.x #=> 1 # def __as__( klass=nil, &blk ) selfclass = Kernel.instance_method(:class).bind(self).call klass ||= selfclass.superclass if selfclass.ancestors.include?(klass) Functor.new do |meth, *args| # &blk| klass.instance_method(meth).bind(self).call(*args) # ,&blk) end else raise ArgumentError, "#{klass} is not an ancestor" end end alias_method :as, :__as__ =begin :nodoc: def as( role, &blk ) unless role.is_a?(Class) role = self.class.const_get( role ) end @roles ||= {} @roles[role] ||= role.allocate robj = @roles[role] robj.assign_from( self ) result = robj.instance_eval( &blk ) self.assign_from( robj ) # w/o this much like namespaces result end =end end # _____ _ # |_ _|__ ___| |_ # | |/ _ \/ __| __| # | | __/\__ \ |_ # |_|\___||___/\__| # =begin test require 'test/unit' class TCKernel < Test::Unit::TestCase class A def x; "A.x"; end def y; "A.y"; end end class B < A def x; "B.x" end def y; "B.y" end end class C < B def x; "C.x"; end def y; as.x ; end end def setup @c = C.new end def test_as assert_equal("B.x", @c.y) assert_equal("C.x", @c.x) end end =end
Version data entries
12 entries across 12 versions & 1 rubygems