Skip to content

Instantly share code, notes, and snippets.

@chorn
Created October 21, 2015 14:54
Show Gist options
  • Save chorn/eb7b7a61a43c33568bfc to your computer and use it in GitHub Desktop.
Save chorn/eb7b7a61a43c33568bfc to your computer and use it in GitHub Desktop.
class Policy
attr_reader :features
def initialize(defaults=nil)
if defaults && defaults.respond_to?(:features)
@features = defaults.features.dup
else
@features = {}
end
end
def enable(*feature_names)
set_features(feature_names, true)
end
def disable(*feature_names)
set_features(feature_names, false)
end
def set_features(feature_names, setting)
[feature_names].flatten.each do |name|
@features[name.to_sym] = setting
end
self
end
def method_missing(method_sym, *arguments, &block)
return super unless method_sym.to_s =~ /\?$/
feature_name = method_sym.to_s.gsub(/\?$/, '').to_sym
if @features.key?(feature_name)
@features[feature_name]
else
fail ArgumentError, "Feature: #{feature_name} is not defined in this Policy"
end
end
end
p = Policy.new.enable(:derp1, :derp2).disable(:underp1)
puts p.derp1?
puts p.derp2?
puts p.underp1?
begin
puts p.noderp?
rescue
puts 'Exception, nice.'
end
p2 = Policy.new(p).enable(:underp1).disable(:derp2).enable(:noderp)
puts p2.derp1?
puts p2.derp2?
puts p2.underp1?
puts p2.noderp?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment