Sha256: cbed7b5ed9ea8e5a0642b2496c87069ed49f6b83428164e98f121eed0828681c

Contents?: true

Size: 1.76 KB

Versions: 1

Compression:

Stored size: 1.76 KB

Contents

module MotionBindable
  class Strategy
    @strategies_map = [{ class: Strategy, candidates: [Object] }]

    def self.register_strategy(strategy, *objects)
      @strategies_map << { class: strategy, candidates: objects }
    end

    def self.find_by_reference(object)
      @strategies_map.reverse.find do |h|
        h[:candidates].one? { |e| object.is_a? e }
      end.fetch(:class)
    end

    attr_accessor :object
    attr_accessor :bound
    attr_reader :attr_name

    def initialize(object, attr_name)
      @attr_name = attr_name.to_sym
      self.object = object
    end

    public # (Optional) Methods to override

    # def start_observing; end
    # def start_observing_bound; end
    # def start_observing_object; end
    # def on_object_change; end
    # def on_bound_change; end

    def bound_value
    end

    def object_value
    end

    def bind(bound)
      self.bound = bound
      initial_state
      start_listen
      self
    end

    def unbind
    end

    # Deprecation support purposes
    alias_method :refresh_bound, :bound_value
    alias_method :refresh_object, :object_value

    private # Methods to leave alone

    def attribute
      object.send(attr_name)
    end

    def attribute=(value)
      object.send(:"#{attr_name.to_s}=", value)
    end

    def initial_state
      # We try to find an existing value and fill it up
      if attribute.nil? && respond_to?(:on_bound_change)
        on_bound_change(bound_value)
      elsif respond_to?(:on_object_change)
        on_object_change(object_value)
      end
    end

    def start_listen
      start_observing if respond_to?(:start_observing)
      start_observing_bound if respond_to?(:start_observing_bound)
      start_observing_object if respond_to?(:start_observing_object)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
motion_bindable-0.3.0 lib/motion_bindable/strategy.rb