lib/attribute_predicates/extensions/module.rb in attribute_predicates-0.1.0 vs lib/attribute_predicates/extensions/module.rb in attribute_predicates-0.1.1

- old
+ new

@@ -1,37 +1,81 @@ module PluginAWeek #:nodoc: module AttributePredicates - module Module - def self.included(base) #:nodoc: - base.class_eval do - [:attr, :attr_reader, :attr_writer, :attr_accessor].each do |method| - alias_method_chain method, :predicates + module Extensions + # Adds support for automatically defining predicate methods using +attr_predicate+ + # when defining attributes using +attr+, +attr_reader+, +attr_reader+, and + # +attr_accessor+. + # + # == Examples + # + # The predicate methods for attributes checks whether the value is blank? + # for determining whether true or false should be returned. For example, + # + # class Person + # attr_accessor :value + # end + # + # p = Person.new + # p.value = false + # p.value? # => false + # + # p.value = true + # p.value? # => true + # + # p.value = [] + # p.value? # => false + # + # p.value = [false] + # p.value? # => true + module Module + def self.included(base) #:nodoc: + base.class_eval do + %w(attr attr_reader attr_writer attr_accessor).each do |method| + alias_method "#{method}_without_predicates", method + alias_method method, "#{method}_with_predicates" + end end end - end - - def attr_with_predicates(*args) #:nodoc: - attr_without_predicates(*args) - attr_predicate(args.first) - end - - [:attr_reader, :attr_writer, :attr_accessor].each do |method| - define_method("#{method}_with_predicates") do |*symbols| - send("#{method}_without_predicates", *symbols) - symbols.each {|symbol| attr_predicate(symbol)} + + # Defines a predicate method, using +attr_predicate+, in addition to the + # attribute accessors. For example, + # + # module Mod + # attr :is_okay + # end + # + # Mod.instance-methods.sort # => ["is_okay", "is_okay?"] + def attr_with_predicates(*args) + attr_without_predicates(*args) + attr_predicate(args.first) end - end - - private - # Returns true if the specified variable is not blank, otherwise false - def attr_predicate(symbol) - define_method("#{symbol}?") do - !instance_variable_get("@#{symbol}").blank? + + [:attr_reader, :attr_writer, :attr_accessor].each do |method| + define_method("#{method}_with_predicates") do |*symbols| + send("#{method}_without_predicates", *symbols) + symbols.each {|symbol| attr_predicate(symbol)} end end + + private + # Returns true if the specified variable is not blank, otherwise false + def attr_predicate(symbol) + define_method("#{symbol}?") do + value = instance_variable_get("@#{symbol}") + if value.respond_to?(:blank?) + # Use ActiveSupport's implementation + !value.blank? + elsif value.respond_to?(:empty?) + !value.empty? + else + !!value + end + end + end + end end end end ::Module.class_eval do - include PluginAWeek::AttributePredicates::Module + include PluginAWeek::AttributePredicates::Extensions::Module end