lib/woyo/world/attributes.rb in woyo-world-0.0.6 vs lib/woyo/world/attributes.rb in woyo-world-0.0.7
- old
+ new
@@ -6,198 +6,149 @@
module Woyo
module Attributes
- def self.included(base)
- base.extend(ClassMethods)
+ def attribute *attrs, &block
+ send :_attributes, attrs, ivn: '@attributes', &block
end
- def self.prepended(base)
- base.singleton_class.prepend(ClassMethods) # base.extend(ClassMethods) also seems to work, what's the diff ?
+ def attributes *attrs, &block
+ send :_attributes, attrs, ivn: '@attributes', &block
end
-
- def initialize *args
- initialize_attributes
- initialize_groups
- initialize_boolean_groups
- initialize_is_overrides
- #super # we'll need this if we prepend Attributes again
- end
- module ClassMethods
-
- def define_attr_methods attr, default = nil
- define_attr_default attr, default
- define_attr_equals attr
- define_attr attr
- if default == true || default == false # boolean convenience methods
- define_attr? attr
- define_attr! attr
- end
+ def _attributes attrs, ivn:, &block
+ if instance_variable_defined? ivn
+ ivar = instance_variable_get ivn
+ else
+ ivar = instance_variable_set ivn, Woyo::Attributes::AttributesHash.new
end
-
- def define_attr_default attr, default
- define_method "#{attr}_default" do
- if default.respond_to? :call
- return default.arity == 0 ? default.call : default.call(self)
+ return ivar if attrs.empty?
+ attrs.each do |attr|
+ case
+ when attr.kind_of?( Hash )
+ attr.each do |attr_sym,default|
+ define_attr_methods attr_sym, default, ivn: ivn
+ ivar[attr_sym] = send "#{attr_sym}_default"
end
- default
- end
- end
-
- def define_attr_equals attr
- define_method "#{attr}=" do |arg|
- attributes[attr] = arg
- end
- end
-
- def define_attr attr
- define_method attr do |arg = nil|
- return attributes[attr] = arg unless arg.nil?
- return attributes[attr] unless attributes[attr].kind_of? Hash
- true_attribute_match = attributes[attr].detect { |name,value| attributes[name] == true }
- return true_attribute_match[1] if true_attribute_match
- attributes[attr]
- end
- end
-
- def define_attr? attr
- define_method "#{attr}?" do
- ( send attr ) ? true : false
- end
- end
-
- def define_attr! attr
- define_method "#{attr}!" do
- send "#{attr}=", true
- end
- end
-
- def attributes *attrs
- @attributes ||= []
- return @attributes if attrs.empty?
- attrs.each do |attr|
- if attr.kind_of? Hash
- attr.each do |attr_sym,default_value|
- @attributes << attr_sym unless @attributes.include? attr_sym
- define_attr_methods attr_sym, default_value
- end
- else
- unless @attributes.include? attr
- @attributes << attr
- define_attr_methods attr
- end
+ when block
+ define_attr_methods attr, block, ivn: ivn
+ ivar[attr] = send "#{attr}_default"
+ else
+ unless ivar.include? attr
+ define_attr_methods attr, ivn: ivn
+ ivar[attr] = nil
end
end
end
+ end
- def attribute *attrs
- self.attributes *attrs
+ def define_attr_methods( attr, default = nil, ivn: )
+ define_attr_default attr, default
+ define_attr_equals attr, ivn: ivn
+ define_attr attr, ivn: ivn
+ if default == true || default == false # boolean convenience methods
+ define_attr? attr
+ define_attr! attr
end
+ end
- def groups
- @groups ||= {}
+ def define_attr_default attr, default
+ define_singleton_method "#{attr}_default" do
+ default
end
+ end
- def group sym, *attrs
- @groups ||= {}
- group = @groups[sym] ? @groups[sym] : ( @groups[sym] = [] )
- self.attributes *attrs
- attrs.each do |attr|
- if attr.kind_of? Hash
- attr.each do |attr_sym,default_value|
- group << attr_sym
- end
- else
- group << attr
- end
- end
- define_method sym do
- groups[sym]
- end
- group
+ def define_attr_equals( attr, ivn: )
+ define_singleton_method "#{attr}=" do |arg|
+ ivar = instance_variable_get ivn
+ ivar[attr] = arg
end
+ end
- def boolean_groups
- @boolean_groups ||={}
- end
-
- def group! sym, *attrs
- @boolean_groups ||= {}
- group = @boolean_groups[sym] ? @boolean_groups[sym] : ( @boolean_groups[sym] = [] )
- self.attributes *attrs
- attrs.each do |attr|
- define_attr? attr
- define_attr! attr
- if attr.kind_of? Hash
- attr.each do |attr_sym,default_value|
- group << attr_sym
- end
- else
- group << attr
- end
+ def define_attr( attr, ivn: )
+ define_singleton_method attr do |arg = nil|
+ ivar = instance_variable_get ivn
+ return ivar[attr] = arg unless arg.nil?
+ case
+ when ivar[attr].kind_of?( Hash )
+ true_attribute_match = ivar[attr].detect { |name,value| ivar[name] == true }
+ return true_attribute_match[1] if true_attribute_match
+ ivar[attr]
+ when ivar[attr].respond_to?( :call )
+ return ivar[attr].arity == 0 ? ivar[attr].call : ivar[attr].call(self)
+ else
+ ivar[attr]
end
- define_method sym do
- boolean_groups[sym]
- end
- group
end
+ end
- def is *attrs
- @is_overrides ||= []
- attrs.each do |attr|
- @is_overrides << attr unless @is_overrides.include? attr
- self.attribute( { attr => true } )
- end
+ def define_attr? attr
+ define_singleton_method "#{attr}?" do
+ ( send attr ) ? true : false
end
+ end
- def is_overrides
- @is_overrides ||= []
+ def define_attr! attr
+ define_singleton_method "#{attr}!" do
+ send "#{attr}=", true
end
-
- end # module ClassMethods
-
- def initialize_attributes
- @attributes = self.class.attributes.each_with_object(Woyo::Attributes::AttributesHash.new) do |attr,hash|
- hash[attr] = send "#{attr}_default"
- end
end
- def initialize_groups
- @groups = {}
- self.class.groups.each { |sym,members| @groups[sym] = Woyo::Attributes::Group.new @attributes, *members }
- @groups
+ def is? attr
+ send "#{attr}?"
end
- def initialize_boolean_groups
- @boolean_groups = {}
- self.class.boolean_groups.each { |sym,members| @boolean_groups[sym] = Woyo::Attributes::BooleanGroup.new @attributes, *members }
- @boolean_groups
+ def is attr
+ send "#{attr}=", true
end
- def initialize_is_overrides
- self.class.is_overrides.each { |attr| send "#{attr}!" }
- end
-
- def attributes
- @attributes
- end
-
def groups
@groups
end
- def boolean_groups
- @boolean_groups
+ def group sym, *attrs
+ @groups ||= {}
+ grp = @groups[sym] ? @groups[sym] : ( @groups[sym] = Woyo::Attributes::Group.new attributes )
+ attributes *attrs
+ attrs.each do |attr|
+ if attr.kind_of? Hash
+ attr.each do |attr_sym,default_value|
+ grp << attr_sym
+ end
+ else
+ grp << attr
+ end
+ end
+ define_singleton_method sym do
+ @groups[sym]
+ end
+ grp
end
- def is? attr
- send "#{attr}?"
+ def exclusions
+ @exclusions
end
-
- def is attr
- send "#{attr}=", true
+
+ def exclusion sym, *attrs
+ @exclusions ||= {}
+ exc = @exclusions[sym] ? @exclusions[sym] : ( @exclusions[sym] = Woyo::Attributes::Exclusion.new attributes )
+ attributes *attrs
+ attrs.each do |attr|
+ define_attr? attr
+ define_attr! attr
+ if attr.kind_of? Hash
+ attr.each do |attr_sym,default_value|
+ exc << attr_sym
+ end
+ else
+ exc << attr
+ end
+ end
+ define_singleton_method sym do
+ @exclusions[sym]
+ end
+ exc
end
end
end