PrivateAttrs
Introducing Private Attrs
The private_attrs gem is a quick addition to Ruby’s Class object that allows for defining private attribute methods.
Usage
class Crocodile
private_attr_reader :temper
def initialize(temper)
@temper = temper
end
end
Crocodile.new('angry').temper # => NoMethodError "private method 'temper' called for ...
But, why?
In short, because existing patterns to do this are ugly. This particular pattern violates the ‘Scissors Rule' of coding in that there is not a clear separation between public and private methods.
class Crocodile
private
attr_reader :temper
public
attr_reader :asleep
def initialize(temper)
@temper = temper
end
def bites?
if angry? && !asleep?
end
private
def angry?
temper == 'angry'
end
def asleep?
current_time = Time.now
(current_time.hour >= 17) and (current_time.hour <= 21)
end
end
This example is better but still not ideal as we want all of our attribute methods defined at the top of any given class.
class Truck
attr_reader :transmission_type
attr_reader :weight
def initialize(wheel_count:, transmission_type:, weight:)
@wheel_count = wheel_count
@transmission_type = transmission_type
@weight = weight
end
def oversized
wheel_count > 4
end
def driver_must_shift?
transmission_type == :manual
end
private
attr_reader :wheel_count
end
Other patterns are even worse…
class Pet
attr_accessor :species
private :species
private :species=
attr_reader :hairy
private :hairy
def initialize(species, hairy)
#...
end
end
Installation
Add this line to your application's Gemfile:
gem 'private_attrs'
And then execute:
$ bundle
Or install it yourself as:
$ gem install private_attrs
License
The gem is available as open source under the terms of the MIT License.