Class: Class

Inherits:
Object show all
Defined in:
lib/carrierwave/core_ext/inheritable_attributes.rb

Overview

Retain for backward compatibility. Methods are now included in Class.

Instance Method Summary collapse

Instance Method Details

#extlib_inheritable_accessor(*syms, &block) ⇒ Array[#to_s]

Defines class-level inheritable attribute accessor. Attributes are available to subclasses, each subclass has a copy of parent’s attribute.

define inheritable accessor for.

Parameters:

  • *syms (Array[*#to_s, Hash{:instance_writer => Boolean}])

    Array of attributes to

  • syms (Hash)

    a customizable set of options

Options Hash (*syms):

  • :instance_writer (Boolean)

    if true, instance-level inheritable attribute writer is defined.

Returns:

  • (Array[#to_s])

    An Array of attributes turned into inheritable accessors.



104
105
106
107
# File 'lib/carrierwave/core_ext/inheritable_attributes.rb', line 104

def extlib_inheritable_accessor(*syms, &block)
  extlib_inheritable_reader(*syms)
  extlib_inheritable_writer(*syms, &block)
end

#extlib_inheritable_reader(*ivars, &block) ⇒ Array[#to_s]

TODO:

Do we want to block instance_reader via :instance_reader => false

TODO:

It would be preferable that we do something with a Hash passed in

Defines class-level inheritable attribute reader. Attributes are available to subclasses, each subclass has a copy of parent’s attribute.

(error out or do the same as other methods above) instead of silently moving on). In particular, this makes the return value of this function less useful.

Parameters:

  • *syms (Array[#to_s])

    Array of attributes to define inheritable reader for.

Returns:

  • (Array[#to_s])

    Array of attributes converted into inheritable_readers.



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/carrierwave/core_ext/inheritable_attributes.rb', line 41

def extlib_inheritable_reader(*ivars, &block)
  options = ivars.extract_options!

  ivars.each do |ivar|
    self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
      def self.#{ivar}
        return @#{ivar} if self.object_id == #{self.object_id} || defined?(@#{ivar})
        ivar = superclass.#{ivar}
        return nil if ivar.nil? && !#{self}.instance_variable_defined?("@#{ivar}")
        @#{ivar} = ivar.duplicable? ? ivar.dup : ivar
      end
    RUBY
    unless options[:instance_reader] == false
      self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
        def #{ivar}
          self.class.#{ivar}
        end
    RUBY
    end
    instance_variable_set(:"@#{ivar}", yield) if block_given?
  end
end

#extlib_inheritable_writer(*ivars) ⇒ Array[#to_s]

TODO:

We need a style for class_eval <<-HEREDOC. I’d like to make it

Defines class-level inheritable attribute writer. Attributes are available to subclasses, each subclass has a copy of parent’s attribute.

define inheritable writer for. class_eval(<<-RUBY, __FILE__, __LINE__), but we should codify it somewhere.

Parameters:

  • *syms (Array[*#to_s, Hash{:instance_writer => Boolean}])

    Array of attributes to

  • syms (Hash)

    a customizable set of options

Returns:

  • (Array[#to_s])

    An Array of the attributes that were made into inheritable writers.



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/carrierwave/core_ext/inheritable_attributes.rb', line 76

def extlib_inheritable_writer(*ivars)
  options = ivars.extract_options!

  ivars.each do |ivar|
    self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
      def self.#{ivar}=(obj)
        @#{ivar} = obj
      end
    RUBY
    unless options[:instance_writer] == false
      self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
        def #{ivar}=(obj) self.class.#{ivar} = obj end
      RUBY
    end

    self.send("#{ivar}=", yield) if block_given?
  end
end