Sha256: 77cbfd9151f7a3cc4ee8f8659f7b1acb3a932d8113cf1e544d194380d60dd627

Contents?: true

Size: 987 Bytes

Versions: 9

Compression:

Stored size: 987 Bytes

Contents

# Adds Redcar::Observable to Struct. e.g:
#
#   irb> Customer = ObservableStruct.new(:name, :address) 
#   => Customer
#   irb> customer = Customer.new("Dave", "123 Main")
#   => #<Customer name="Dave", address="123 Main">
#   irb> customer.add_listener(:changed_name) { |new_name| puts "the new name is: #{new_name}" }
#   => #<Proc:0x65f4cdd2@(irb):203>
#   irb> customer.name = "Dan"
#   the new name is Dan
#   => #<Customer name="Dan", address="123 Main">
class ObservableStruct
  def self.new(*args)
    klass = Struct.new(*args)
    klass.send(:include, Redcar::Observable)
    if args.first.is_a?(String)
      accessors = args[1..-1]
    else
      accessors = args
    end
    accessors.each do |accessor|
      klass.class_eval %Q{
        alias_method :real_#{accessor}=, :#{accessor}=
        def #{accessor}=(val)
          notify_listeners(:changed_#{accessor}, val) do
            self.real_#{accessor} = val
          end
        end
      }
    end
    klass
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
redcar-0.3.7.1 plugins/core/lib/core/observable_struct.rb
redcar-0.3.7 plugins/core/lib/core/observable_struct.rb
redcar-0.3.6 plugins/core/lib/core/observable_struct.rb
redcar-0.3.5 plugins/core/lib/core/observable_struct.rb
redcar-0.3.4.3 plugins/core/lib/core/observable_struct.rb
redcar-0.3.4.2 plugins/core/lib/core/observable_struct.rb
redcar-0.3.4.1 plugins/core/lib/core/observable_struct.rb
redcar-0.3.4 plugins/core/lib/core/observable_struct.rb
redcar-0.3.3 plugins/core/lib/core/observable_struct.rb