Class: Class

Inherits:
Object
  • Object
show all
Defined in:
lib/attr_plus/class.rb

Overview

Should add cattr_accessor, which provides accessors for @@ class variables!

Instance Method Summary collapse

Instance Method Details

#class_attr_accessor(*names) ⇒ Object

Executes #class_attr_reader and #class_attr_writer.

Examples:


class Polygon
  class_attr_accessor :sides
end

Polygon.sides #=> nil
Polygon.sides = 5
Polygon.sides #=> 5
pentagon = Polygon.new
pentagon.sides #=> 5

See Also:



103
104
105
106
# File 'lib/attr_plus/class.rb', line 103

def class_attr_accessor(*names)
  class_attr_reader(*names)
  class_attr_writer(*names)
end

#class_attr_reader(*args) ⇒ Object

Defines a method that allows you to read an instance variable set at the class level. Also defines an instance method that reads the same thing. Comparable to #attr_reader for the class level.

So in summary defines:

  • .var (which gets @var) and

  • #var (which gets self.class.var)

Examples:


class Polygon
  class_attr_reader :sides

  def self.is_a=(shape)
    case shape
      when 'triangle' then @sides = 3
      when 'square' then @sides = 4
    end
  end
end

Polygon.sides #=> nil
Polygon.is_a 'triangle'
Polygon.sides #=> 3
t = Polygon.new
t.sides #=> 3


35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/attr_plus/class.rb', line 35

def class_attr_reader(*args)
  names, default = separate_arguments_and_set_defaults(args)
  names.each do |name|
    class_eval "      def self.\#{name}\n        @\#{name}\n      end\n\n      def \#{name}\n        @\#{name} ||= self.class.send(:\#{name}).dup\n      end\n    EOS\n    self.instance_variable_set(\"@\#{name}\", (default.dup rescue default))\n  end\nend\n"        

#class_attr_writer(*args) ⇒ Object

Defines a method for to write to an instance varaible set at the class level. Comparable to #attr_writer for the class level.

So in summary defines: .var= (which sets @var)

Examples:


class Polygon
  class_attr_writer :sides

  def self.rectangle?; @sides == 4; end
  def self.triangle?; @sides == 3; end
end

Polygon.rectangle? #=> false
Polygon.sides = 4
Polygon.rectangle? #=> true
Polygon.sides = 3
Polygon.triangle? #=> true


71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/attr_plus/class.rb', line 71

def class_attr_writer(*args)
  names, default = separate_arguments_and_set_defaults(args)
  names.each do |name|
    class_eval "      def self.\#{name}=(obj)\n        @\#{name} = obj\n      end\n      \n      def \#{name}=(obj)\n        @\#{name} = obj\n      end\n    EOS\n  end\nend\n"        

#inheritable_class_attr_accessor(*names) ⇒ Object

Executes #inheritable_class_attr_reader and #inheritable_class_attr_writer.

Examples:


class Polygon
  inheritable_class_attr_accessor :sides, :angles
  self.angles = [90]
end

class Triangle < Polygon
  self.sides = 3
  self.angles = [100, 35, 45]
end

class Rectangle < Polygon
  self.sides = 4
  self.angles << 60 << 100 << 110
end

class Square < Rectangle
  # should get 4 sides from rectange
  self.angles = [90] * 4
end

Polygon.sides    #=> nil
Triangle.sides   #=> 3
Rectangle.sides  #=> 4
Rectangle.angles #=> [90, 60, 100, 110]
Square.sides     #=> 4
Square.angles    #=> [90, 90, 90, 90]

See Also:



175
176
177
178
# File 'lib/attr_plus/class.rb', line 175

def inheritable_class_attr_accessor(*names)
  inheritable_class_attr_reader(*names)
  inheritable_class_attr_writer(*names)
end

#inheritable_class_attr_reader(*args) ⇒ Object

Creates a class and instance method to read the class level variable(s) with the name(s) provided. If no value has been set it attempts to use the value of the superclass.

See Also:



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/attr_plus/class.rb', line 115

def inheritable_class_attr_reader(*args)
  names, default = separate_arguments_and_set_defaults(args)
  names.each do |name|
    class_eval "      def self.\#{name}\n        if @\#{name}\n          @\#{name}\n        elsif superclass.respond_to? :\#{name}\n          @\#{name} ||= superclass.\#{name}\n        end\n      end\n\n      def \#{name}\n        @\#{name} ||= self.class.send(:\#{name})\n      end\n    EOS\n    self.instance_variable_set(\"@\#{name}\", (default.dup rescue default))\n  end\n  inheritable_attrs.concat(names).uniq!\nend\n"        

#inheritable_class_attr_writer(*args) ⇒ Object

The same as #class_attr_writer.



137
138
139
# File 'lib/attr_plus/class.rb', line 137

def inheritable_class_attr_writer(*args)
  class_attr_writer(*args)
end