Class Needle::Lifecycle::Proxy
In: lib/needle/lifecycle/proxy.rb
Parent: Object

A proxy class to aid in deferred instantiation of service points. This is used primarily by the "deferred" service models.

Methods

inspect   method_missing   new  

Public Class methods

Create a new proxy object that wraps the object returned by either the proc_obj or callback. (Only one of proc_obj or callback should be specified.)

[Source]

    # File lib/needle/lifecycle/proxy.rb, line 29
29:       def initialize( proc_obj=nil, *args, &callback )
30:         if proc_obj && callback
31:           raise ArgumentError, "only specify argument OR block, not both"
32:         end
33: 
34:         @callback = proc_obj || callback or
35:           raise ArgumentError, "callback required"
36: 
37:         @args = args
38:         @mutex = QueryableMutex.new
39:         @instantiation_failed = false
40:         @instance = nil
41:       end

Public Instance methods

[Source]

    # File lib/needle/lifecycle/proxy.rb, line 85
85:       def inspect
86:         "#<#{self.class.name}:#{"0x%08x"%self.object_id}:" +
87:         "instantiated=>#{@instance ? true : false}>"
88:       end

Attempts to invoke the given message on the service. If the service has not yet been instantiated, it will be instantiated and stored.

[Source]

    # File lib/needle/lifecycle/proxy.rb, line 45
45:       def method_missing( sym, *args, &block )
46:         unless @instance || @instantiation_failed
47:           @mutex.synchronize do
48:             unless @instance || @instantiation_failed
49:               begin
50:                 @instance = @callback.call( *@args )
51:               rescue Exception
52:                 @instantiation_failed = true
53:                 raise
54:               end
55:             end
56:           end
57:         end
58: 
59:         unless @instantiation_failed
60:           @instance.__send__ sym, *args, &block
61:         else
62:           # just return nil... this way, a failed instantiation won't barf
63:           # more than once... I hope...
64:         end
65:       end

[Validate]