Sha256: 643d2dd4de08af7561a8b00548ced52708eebe56fdc92adf36d0efe3ac7c2007

Contents?: true

Size: 1.15 KB

Versions: 2

Compression:

Stored size: 1.15 KB

Contents

module Attributes
  VERSION = '3.0.1'
  def attributes *a, &b
    unless a.empty?
      hashes, names = a.partition{|x| Hash === x}

      names_and_defaults = {}
      hashes.each{|h| names_and_defaults.update h}
      names.flatten.compact.each{|name| names_and_defaults.update name => nil}

      names_and_defaults.each do |name, default|
        init = b || lambda { default }
        ivar = "@#{ name }"
        getter = "#{ name }"
        setter = "#{ name }="
        query = "#{ name }?"

        define_method(setter) do |value|
          instance_variable_set ivar, value
        end

        define_method(getter) do |*value|
          unless value.empty?
            send setter, value.shift
          else
            defined = instance_eval "defined? #{ ivar }"
            unless defined
              send setter, instance_eval(&init) 
            end
            instance_variable_get ivar
          end
        end

        alias_method query, getter

        (attributes << name).uniq!
        attributes
      end
    else
      @attributes ||= [] 
    end
  end
  def attribute *a, &b
    attributes *a, &b
  end
end

class Module
  include Attributes
end

Version data entries

2 entries across 1 versions & 1 rubygems

Version Path
attributes-3.0.1 lib/attributes-3.0.1.rb
attributes-3.0.1 lib/attributes.rb