Sha256: 46f33894dcd50923b68aba3acfc427315f05290ee1688d6a0d4768904275b7a9

Contents?: true

Size: 1.22 KB

Versions: 2

Compression:

Stored size: 1.22 KB

Contents

module Volt
  module ReactiveAccessors
    module ClassMethods
      # Create a method to read a reactive value from an instance value.  If it
      # is not setup, create it so it can be updated through the reactive value
      # at a later point.
      def reactive_reader(*names)
        names.each do |name|
          var_name = :"@#{name}"
          define_method(name.to_sym) do
            value = instance_variable_get(var_name)

            __reactive_dependency_get(name).depend

            value
          end
        end
      end

      def reactive_writer(*names)
        names.each do |name|
          var_name = :"@#{name}"
          define_method("#{name}=") do |new_value|
            instance_variable_set(var_name, new_value)

            __reactive_dependency_get(name).changed!
          end
        end
      end

      def reactive_accessor(*names)
        reactive_reader(*names)
        reactive_writer(*names)
      end
    end

    def self.included(base)
      base.send :extend, ClassMethods
    end

    def __reactive_dependency_get(var_name)
      value_dep = instance_variable_get(:"@__#{var_name}_dependency")
      value_dep ||= instance_variable_set(:"@__#{var_name}_dependency", Dependency.new)
    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
volt-0.9.1 lib/volt/reactive/reactive_accessors.rb
volt-0.9.1.pre5 lib/volt/reactive/reactive_accessors.rb