Sha256: adff2f6063c4615e8a643db218cce815f0f208a9d75f07ce20ee6ca3a8ab06b6

Contents?: true

Size: 1.27 KB

Versions: 5

Compression:

Stored size: 1.27 KB

Contents

module Attributes
  VERSION = '3.2.0'

  def version() VERSION end

  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, getter, setter, query = "@#{ name }", "#{ name }", "#{ name }=", "#{ 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 }"
            send setter, instance_eval(&init) unless defined
            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 Object
  def attributes *a, &b
    sc = class << self; self; end
    sc.attributes *a, &b
  end

  def attribute(*a, &b) attributes *a, &b end
end

class Module; include Attributes; end

Version data entries

5 entries across 3 versions & 2 rubygems

Version Path
alib-0.5.0 lib/alib-0.5.0/attributes-3.2.0.rb
alib-0.5.0 lib/alib-0.5.0/attributes.rb
alib-0.5.1 lib/alib-0.5.1/attributes-3.2.0.rb
alib-0.5.1 lib/alib-0.5.1/attributes.rb
main-0.0.2 lib/main/attributes.rb