-
-
Notifications
You must be signed in to change notification settings - Fork 272
/
cell.rb
72 lines (60 loc) · 1.71 KB
/
cell.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# A proxy object returned from Celluloid::Actor.new/new_link which converts
# the normal Ruby method protocol into an inter-actor message protocol
class Celluloid::Proxy::Cell < Celluloid::Proxy::Sync
# Used for reflecting on proxy objects themselves
def __class__
::Celluloid::Proxy::Cell
end
def initialize(mailbox, actor_proxy, klass)
super(mailbox, klass)
@actor_proxy = actor_proxy
@sync_proxy = ::Celluloid::Proxy::Sync.new(mailbox, klass)
@async_proxy = ::Celluloid::Proxy::Async.new(mailbox, klass)
@future_proxy = ::Celluloid::Proxy::Future.new(mailbox, klass)
end
def _send_(meth, *args, &block)
method_missing :__send__, meth, *args, &block
end
def inspect
method_missing :inspect
rescue ::Celluloid::DeadActorError
"#<::Celluloid::Proxy::Cell(#{@klass}) dead>"
end
def method(name)
::Celluloid::Internals::Method.new(self, name)
end
alias_method :sync, :method_missing
# Obtain an async proxy or explicitly invoke a named async method
def async(method_name = nil, *args, &block)
if method_name
@async_proxy.method_missing method_name, *args, &block
else
@async_proxy
end
end
# Obtain a future proxy or explicitly invoke a named future method
def future(method_name = nil, *args, &block)
if method_name
@future_proxy.method_missing method_name, *args, &block
else
@future_proxy
end
end
def alive?
@actor_proxy.alive?
end
def dead?
@actor_proxy.dead?
end
def thread
@actor_proxy.thread
end
# Terminate the associated actor
def terminate
@actor_proxy.terminate
end
# Terminate the associated actor asynchronously
def terminate!
@actor_proxy.terminate!
end
end