# class Rinda::TupleEntry

A `TupleEntry` is a `Tuple` (i.e. a possible entry in some Tuplespace) together with expiry and cancellation data.

### Attributes

expires[RW]

### Public Class Methods

new(ary, sec=nil) click to toggle source

Creates a `TupleEntry` based on `ary` with an optional renewer or expiry time `sec`.

A renewer must implement the `renew` method which returns a `Numeric`, nil, or true to indicate when the tuple has expired.

    # File lib/rinda/tuplespace.rb, line 26
    def initialize(ary, sec=nil)
      @cancel = false
      @expires = nil
      @tuple = make_tuple(ary)
      @renewer = nil
      renew(sec)
    end

### Public Instance Methods

[](key) click to toggle source

Retrieves `key` from the tuple.

    # File lib/rinda/tuplespace.rb, line 110
    def [](key)
      @tuple[key]
    end

alive?() click to toggle source

A `TupleEntry` is dead when it is canceled or expired.

    # File lib/rinda/tuplespace.rb, line 44
    def alive?
      !canceled? && !expired?
    end

cancel() click to toggle source

Marks this `TupleEntry` as canceled.

    # File lib/rinda/tuplespace.rb, line 37
    def cancel
      @cancel = true
    end

canceled?() click to toggle source

Returns the canceled status.

    # File lib/rinda/tuplespace.rb, line 57
    def canceled?; @cancel; end

expired?() click to toggle source

Has this tuple expired? (true/false).

A tuple has expired when its expiry timer based on the `sec` argument to initialize runs out.

    # File lib/rinda/tuplespace.rb, line 65
    def expired?
      return true unless @expires
      return false if @expires > Time.now
      return true if @renewer.nil?
      renew(@renewer)
      return true unless @expires
      return @expires < Time.now
    end

fetch(key) click to toggle source

Fetches `key` from the tuple.

    # File lib/rinda/tuplespace.rb, line 117
    def fetch(key)
      @tuple.fetch(key)
    end

make_expires(sec=nil) click to toggle source

Returns an expiry `Time` based on `sec` which can be one of:

`Numeric`

  `sec` seconds into the future

`true`

  the expiry time is the start of 1970 (i.e. expired)

`nil`

  it is Tue Jan 19 03:14:07 GMT Standard `Time` 2038 (i.e. when UNIX clocks will die)

    # File lib/rinda/tuplespace.rb, line 96
    def make_expires(sec=nil)
      case sec
      when Numeric
        Time.now + sec
      when true
        Time.at(1)
      when nil
        Time.at(2**31-1)
      end
    end

make_tuple(ary) click to toggle source

Creates a `Rinda::Tuple` for `ary`.

    # File lib/rinda/tuplespace.rb, line 131
    def make_tuple(ary)
      Rinda::Tuple.new(ary)
    end

renew(sec_or_renewer) click to toggle source

Reset the expiry time according to `sec_or_renewer`.

`nil`

  it is set to expire in the far future.

`true`

  it has expired.

`Numeric`

  it will expire in that many seconds.

Otherwise the argument refers to some kind of renewer object which will reset its expiry time.

    # File lib/rinda/tuplespace.rb, line 84
    def renew(sec_or_renewer)
      sec, @renewer = get_renewer(sec_or_renewer)
      @expires = make_expires(sec)
    end

size() click to toggle source

The size of the tuple.

    # File lib/rinda/tuplespace.rb, line 124
    def size
      @tuple.size
    end

value() click to toggle source

Return the object which makes up the tuple itself: the `Array` or `Hash`.

    # File lib/rinda/tuplespace.rb, line 52
    def value; @tuple.value; end

### Private Instance Methods

get_renewer(it) click to toggle source

Returns a valid argument to `make_expires` and the renewer or nil.

Given `true`, `nil`, or `Numeric`, returns that value and `nil` (no actual renewer). Otherwise it returns an expiry value from calling `it.renew` and the renewer.

    # File lib/rinda/tuplespace.rb, line 144
    def get_renewer(it)
      case it
      when Numeric, true, nil
        return it, nil
      else
        begin
          return it.renew, it
        rescue Exception
          return it, nil
        end
      end
    end