lib/maintain.rb in maintain-0.1.6 vs lib/maintain.rb in maintain-0.1.7

- old
+ new

@@ -1,5 +1,8 @@ +# encoding: UTF-8 +$LOAD_PATH.unshift File.join(File.dirname(__FILE__)) + module Maintain # We're not really interested in loading anything into memory if we don't need to, # so Maintainer, Value, and the Value subclasses are ignored until they're needed. autoload(:Maintainer, 'maintain/maintainer') autoload(:Value, 'maintain/value') @@ -47,62 +50,42 @@ maintainer.instance_eval(&block) end # Define our getters and setters - these are the only methods Maintain will stomp # on if you've already defined them. This is because they're how Maintain works. - class_eval <<-EOC + class_eval <<-EOC, __FILE__ def #{attribute}=(value) # If we can find the maintainer on this attribute, we'll use it to set values. if maintainer = self.class.maintainers[#{attribute.to_sym.inspect}] - # First, we instantiate a value on this maintainer if we haven't already - # @#{attribute} ||= maintainer.value#{"(read_attribute(:#{attribute}))" if active_record} + # Run the exit hook if we're changing the value + maintainer.hook(:exit, #{attribute}.name, self) - # Then run the exit hook if we're changing the value - maintainer.hook(:exit, #{attribute}.value, self) - # Then set the value itself. Maintainer::State will return the value you set, # so if we're setting to nil we get rid of the attribute entirely - it's not # needed and we want the getter to return nil in that case. # unless - #{attribute}.set_value(value) - # @#{attribute} = nil - # Nevermind - all of our test methods rely on that attribute existing, no - # matter what (e.g. maintain(:state) { state :one } and calling "one?" will - # throw an error if we null out our maintainer) - # end#{%{ + #{attribute}.set_value(value)#{%{ # If this is ActiveRecord::Base or a subclass of it, we'll make sure calling the # setter writes a DB-friendly value. - write_attribute(#{attribute.to_s.inspect}, @#{attribute} ? @#{attribute}.value.to_s : nil) + write_attribute(#{attribute.to_s.inspect}, @#{attribute} ? @#{attribute}.value.to_s : @#{attribute}) } if active_record} # Last but not least, run the enter hooks for the new value - cause that's how we # do. - maintainer.hook(:enter, @#{attribute}.value, self) if @#{attribute} + maintainer.hook(:enter, #{attribute}.name, self) if @#{attribute} else # If we can't find a maintainer for this attribute, make our best effort to do what # attr_accessor does - set the instance variable. @#{attribute} = value#{%{ # ... and on ActiveRecord::Base, we'll also write the attribute like a normal setter. - if respond_to?(:write_attribute) - write_attribute(:#{attribute}, @#{attribute}) - end - } if active_record} + write_attribute(:#{attribute}, @#{attribute})} if active_record} end end def #{attribute} - # Start by returning an already-instantiated Maintainer::State if it exists - return @#{attribute} if @#{attribute} - - # If'n it doesn't already exist AND this maintained attribute has a default value (and - # bitmasks must have at least a 0 value), we'll instantiate a Maintainer::State and return - # it. - # if self.class.maintainers[#{attribute.to_sym.inspect}].default? || self.class.maintainers[#{attribute.to_sym.inspect}].bitmask?#{" || attributes['#{attribute}']" if active_record} - # Always return a State, no matter what - @#{attribute} = self.class.maintainers[#{attribute.to_sym.inspect}].value#{"(read_attribute(:#{attribute}))" if active_record} - # end + @#{attribute} ||= self.class.maintainers[#{attribute.to_sym.inspect}].value#{"(read_attribute(:#{attribute}))" if active_record} end EOC # Last! Not least! Save our maintainer directly on this class. We'll use it in our setters (as in above) # and we'll also modify it instead of replacing it outright, so subclasses or mixins can extend functionality \ No newline at end of file