An Alternative Way to Refine A Class

This Jackbox feature showcases an alternative way to refine classes, that also illustrates some additional uses of our modular closures/injectors. For this to happen, we rely once again on our trusty method #lets. Take a look at this example code:

      # Injector declaration

      StringExtensions = injector :StringExtensions do         def to_s            super + '++++'          end       end

      # Jackbox Re-Classing

      lets String do            include StringExtensions       end       str = String('boo')

      assert(         str.to_s == 'boo++++'       )

      assert(         String.new('bar).to_s == "bar"       )

For more details please visit: http://blog.jackbox.us/2015/09/an-alternative-way-to-refine-class.html

# Injector declaration

        jack :StringRefinements do            lets String do # Our re-classing               with singleton_class do                  def new *args, &code                     super(*args, &code) + ' is a special string'                  end               end            end         end

        class OurClass            include StringRefinements()

           def foo_bar               String('foo and bar')            end         end

        c = OurClass.new         c.foo_bar.class.should == String         c.foo_bar.should == 'foo and bar is a special string'

        StringRefinements do            String() do # Adding more stuff               def extra                  :extra               end            end         end

        c.foo_bar.should == 'foo and bar is a special string'         c.foo_bar.extra.should == :extra

        SR = StringRefinements do            lets String do # New Version               def to_s                  super + '****'               end            end         end

        # c is still the same

        c.foo_bar.should == 'foo and bar is a special string'         c.foo_bar.extra.should == :extra

        class OurOtherClass            include SR # Another class application

           def foo_bar               String('foo and bar')            end         end

        d = OurOtherClass.new

        d.foo_bar.to_s.should == 'foo and bar****'         expect{ d.extra }.to raise_error(NoMethodError)