Class: Woyo::Attributes::Exclusion

Inherits:
Group
  • Object
show all
Defined in:
lib/woyo/world/group.rb

Instance Attribute Summary collapse

Attributes inherited from Group

#attributes, #members

Instance Method Summary collapse

Methods inherited from Group

#names, #values

Constructor Details

#initialize(attributes, *members) ⇒ Exclusion

Returns a new instance of Exclusion.



36
37
38
39
40
41
42
43
# File 'lib/woyo/world/group.rb', line 36

def initialize attributes, *members
  super
  if @members && ! @members.empty?
    @default = @members.first
    self[@default] = true
    @members.each { |member| @attributes.add_listener member, self }
  end
end

Instance Attribute Details

#defaultObject (readonly)

Returns the value of attribute default.



34
35
36
# File 'lib/woyo/world/group.rb', line 34

def default
  @default
end

Instance Method Details

#<<(new_member) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/woyo/world/group.rb', line 45

def << new_member
  raise "#{new_member} is not an attribute" unless @attributes.names.include? new_member
  super
  if @members.count == 1
    @default = new_member
    @attributes.set new_member, true
  else
    @attributes.set new_member, false
  end
  @attributes.add_listener new_member, self
  self
end

#[]=(this_member, value) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/woyo/world/group.rb', line 58

def []= this_member, value
  raise "#{this_member} is not a member of this group" unless @members.include? this_member
  super
  if value #true
    # sync group members via AttributesHash#set to prevent triggering notify
    @members.each { |member| @attributes.set(member,false) unless member == this_member }
  else     #false
    if self.count == 2  # binary group
      @members.each { |member| @attributes.set member ,(member != this_member ) }
    else
      self[@default] = true # revert to default
    end
  end
end

#default!Object



83
84
85
# File 'lib/woyo/world/group.rb', line 83

def default!
  self[@default] = true
end

#notify(this_member, value) ⇒ Object



73
74
75
76
77
# File 'lib/woyo/world/group.rb', line 73

def notify this_member, value
  # assuming value==true for now
  # sync group members via AttributesHash#set to prevent re-triggering notify
  @members.each { |member| @attributes.set(member,false) unless member == this_member }
end

#valueObject



79
80
81
# File 'lib/woyo/world/group.rb', line 79

def value
  @members.detect { |member| @attributes[member] } # name of first member with true value 
end