module DaemonKit::Configurable::ClassMethods

Public Instance Methods

configurable( name, *args ) click to toggle source

Create a configurable value on any instance, which can contain a default value, and/or be locked.

Create a standard getter/setter without a default value

configurable :foo

Create a getter/setter with a default value

configurable :foo, true

The final argument can be an options hash, which currently respects only one key: locked (false by default). Locking a configurable means the value can only be set once by the setter method.

configurable :foo, :locked => true

As long as the getter method (foo) returns nil, the standard setter method will work. As soon as the getter returns a non-nil value the setter won't set a new value. To set a new value you'll have to explicitly use the set instance method.

# File lib/daemon_kit/core_ext/configurable.rb, line 44
      def configurable( name, *args )
        opts = args.last.is_a?( Hash ) ? args.pop : {}
        opts = { :locked => false }.merge( opts )

        default = args.size <= 1 ? args.pop : args

        name = name.to_sym

        self.configurables[ name ] = opts
        self.configurable_defaults[ name ] = default

        class_eval( <<-EOF, __FILE__, __LINE__ )
          def #{name}                                    # def foo
            if _configurables[:#{name}].nil?             #   if _configurables[:foo].nil?
              self.class.configurable_defaults[:#{name}] #     self.class.configurable_defaults[:foo]
            else                                         #   else
              _configurables[:#{name}]                   #     _configurables[:foo]
            end                                          #   end
          end                                            #

          def #{name}=( value )                              # def foo=( value )
            if #{name}.nil? ||                               #   if foo.nil? ||
                !self.class.configurables[:#{name}][:locked] #       !self.class.configurables[:foo][:locked]
                                                             #
              _configurables[:#{name}] = value               #     _configurables[:foo] = value
            end                                              #   end
          end                                                # end
        EOF
      end