Module: Lanes::Concerns::AttrAccessorWithDefault::ClassMethods

Defined in:
lib/lanes/concerns/attr_accessor_with_default.rb

Instance Method Summary collapse

Instance Method Details

#attr_accessor_with_default(name, default = nil) ⇒ Object

defines a attr_accessor with a default value

Examples:


Shared = Struct.new(:str)
class AttrTestClass
    include AttrAccessorWithDefault
    attr_accessor_with_default :non_copying, ->{ Shared.new("a default string") }
    attr_accessor_with_default :shared, Shared.new("a default string")
end
a = AttrTestClass.new
b = AttrTestClass.new
a.non_copying.str                   #=> "a default string"
a.non_copying.str  = "new_string"   #=> "new string"
b.non_copying.str                   #=> "a default string"

a.shared.str                   #=> "a default string"
b.shared.str                   #=> "a default string"
a.shared.str = "new string"    #=> "new string"
b.shared.str                   #=> "new string"

Parameters:

  • name (Symbol)

    name of the attribute

  • default (Object, lambda, Proc) (defaults to: nil)

    if a value is given, be aware that it will be shared between instances



31
32
33
34
35
# File 'lib/lanes/concerns/attr_accessor_with_default.rb', line 31

def attr_accessor_with_default( name, default=nil )
    attr_writer name
    attr_add_default_setting_method(name)
    attr_reader_with_default( name, default )
end

#attr_add_default_setting_method(name) ⇒ Object



37
38
39
40
41
42
43
# File 'lib/lanes/concerns/attr_accessor_with_default.rb', line 37

def attr_add_default_setting_method(name)
    module_eval do
        define_singleton_method(name) do | value |
            attr_reader_with_default( name, value )
        end
    end
end

#attr_reader_with_default(name, default) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/lanes/concerns/attr_accessor_with_default.rb', line 45

def attr_reader_with_default( name, default )
    module_eval do
        define_method( name ) do
            class << self; self; end.class_eval do
                attr_reader( name )
            end
            instance_var = "@#{name.to_s}".to_sym
            if instance_variable_defined?(instance_var)
                instance_variable_get(instance_var)
            else
                instance_variable_set(instance_var, default.is_a?(Proc) ? default.call : default )
            end
        end
    end
end