Git Product home page Git Product logo

config_leaf's Introduction

ConfigLeaf

ConfigLeaf allows an object to be configured using a terse syntax like Object#instance_eval, while not exposing the internals (protected/private methods and ivars) of the object!

If the user doesn't like to use this ConfigLeaf wrapping, then they can just use normal #tap syntax by requesting a block parameter.

Installation

Add this line to your application's Gemfile:

    gem 'config_leaf'

And then execute:

    $ bundle

Or install it yourself as:

    $ gem install config_leaf

Usage

ConfigLeaf can be used directly by the end-user after an object has been created, but it more likely used by those wanting to allow block setting of config after their object has been instantiated:

    require 'config_leaf'
    
    class Cheese
      attr_accessor :value, :list
      
      def initialize(&block)
        # Set defaults.
        @value = 0
        @list = []

        # Allow the user access via ConfigLeaf syntax.
        ConfigLeaf.wrap self, &block if block_given?
      end

      def reverse!
        @list.reverse!
      end
      
      protected
      def explode!
        DeathStar.instance.boom!
      end
    end

    # User uses the ConfigLeaf block syntax.
    object1 = Cheese.new do
      list [1, 2, 3]      # Calls object.list = [1, 2, 3]
      list << 4           # Calls object.list << 4
      value 5             # Calls object.value = 5
      value list.size     # Calls object.value = object.list.size
      reverse!            # Calls object.reverse!

      ## @value = 99      # Would set @value on the wrapper, not in the wrapped object, so raises an exception.

      ## explode!         # Not allowed because it is protected (raises an exception).
    end

    # User chooses to not use ConfigLeaf block syntax by requesting a block parameter.
    object2 = Cheese.new do |c|
      c.list = [1, 2, 3]
      c.list << 4
      c.value = 5
      c.value = c.list.size
      c.reverse!
    end

    p object1 #=> #<Cheese:0x4340658 @value=4, @list=[4, 3, 2, 1]>
    p object2 #=> #<Cheese:0x45d2b58 @value=4, @list=[4, 3, 2, 1]>

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Added some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

config_leaf's People

Contributors

bil-bas avatar

Stargazers

 avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.