Sha256: 8c4c3fe3b39cf4ad6814d29c74039cabf946f668159da36761c2ceea8d6a3695

Contents?: true

Size: 1.19 KB

Versions: 1

Compression:

Stored size: 1.19 KB

Contents

module Observed
  module Configurable

    def initialize(args={})
      configure(args)
    end

    def configure(args={})
      if @attributes
        @attributes.merge! args
      else
        @attributes ||= args.dup
      end
      self
    end

    module ClassMethods
      # @param [String|Symbol] name
      def attribute(name, options={})
        define_method(name) do
          instance_variable_get("@#{name.to_s}") || @attributes[name] || self.class.defaults[name] || fail_for_not_configured_parameter(name)
        end
        default_value =  options && options[:default]
        default name => default_value if default_value
      end

      def default(args)
        @defaults = defaults.merge(args)
      end

      def defaults
        @defaults ||= {}
      end

      def create(args)
        self.new(args)
      end

    end

    class NotConfiguredError < RuntimeError; end

    class << self
      def included(klass)
        klass.extend ClassMethods
      end
    end

    private

    def fail_for_not_configured_parameter(name)
      fail NotConfiguredError.new("The parameter `#{name}` is not configured. attributes=#{@attributes}, defaults=#{self.class.defaults}")
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
observed-0.1.1 lib/observed/configurable.rb