SystemAnnouncer
SystemAnnouncer — the singleton system event bus (ADR 0093 Layer 2).
SystemAnnouncer current is the shared bus the runtime emits onto and
tools/IDE panes subscribe to. System facilities publish well-known discrete
Announcement subclasses (e.g. ActorSpawned, ClassLoaded); a tool
subscribes once and filters by event class.
SystemAnnouncer is async-only: announceAndWait: raises
(UnsupportedOperation announceAndWait:) at runtime because the system
bus can have many subscribers and spawn_monitor-per-handler would be an
unbounded process storm under rapid system events. Sync gather is for
per-instance announcers with a known, small subscriber set.
Examples
sub := SystemAnnouncer current when: ActorSpawned do: [:e |
Transcript showLine: e actorClass name
]
Counter spawn // subscription fires: prints "Counter"
sub unsubscribe
Class Methods
The singleton system announcer instance.
Examples
SystemAnnouncer current class // => SystemAnnouncer
Instance Methods
PROHIBITED on SystemAnnouncer — raises UnsupportedOperation. The system bus is async-only (ADR 0093 §1).
PROHIBITED on SystemAnnouncer — raises UnsupportedOperation. The system bus is async-only (ADR 0093 §1).
Inherited Methods
From Announcer
Subscribe: deliver announcements of aClass (or any subclass, via MRO
matching) to the calling process by evaluating aBlock with the event.
Returns a Subscription token for later unsubscription. Each call mints
a distinct subscription — re-subscribing never silently replaces.
Examples
sub := announcer when: PriceChanged do: [:e | e newPrice printNl]
sub isActive // => true
Subscribe: when an announcement of aClass arrives, send sel to
receiver with the event as the sole argument.
Examples
announcer when: PriceChanged send: #handlePrice: to: handler
Subscribe once: deliver exactly one announcement of aClass, then
auto-unsubscribe. Consumed atomically under concurrent announcers.
Examples
announcer when: PriceChanged doOnce: [:e | e newPrice printNl]
Announce an event asynchronously (fire-and-forget). Delivers to every subscriber of the event's class or any ancestor (MRO matching).
Examples
announcer announce: (PriceChanged newPrice: 42)
Announce an event synchronously — wait for every handler to complete, with per-handler fault isolation and a default 5s timeout.
Examples
announcer announceAndWait: (PriceChanged newPrice: 42)
Announce an event synchronously with a custom per-handler timeout (ms).
Examples
announcer announceAndWait: event timeout: 10000
Remove all subscriptions held by receiver on this announcer.
Examples
announcer unsubscribe: self
A read-only snapshot of this announcer's live subscriptions as immutable
SubscriptionNode records (ADR 0093 §7 — object-knows-itself). Reads its
own ETS rows; to act on a subscription, cross back to the live
Subscription token or unsubscribe:. Re-call to refresh.
Scoped to this announcer — it reports only the subscriptions made on
self, not those on other announcers or the system bus.
Examples
announcer when: PriceChanged do: [:e | e printNl]
announcer subscriptions size // => 1
A read-only snapshot of the subscriptions to exactly aClass on this
announcer, as SubscriptionNode records (ADR 0093 §7). Matches exactly
aClass (not subclasses) — the as-subscribed key, mirroring when:do:.
Examples
announcer when: PriceChanged do: [:e | e printNl]
(announcer subscribersOf: PriceChanged) size // => 1
The number of live subscriptions on this announcer (ADR 0093 §7) — scoped
to self. A cheap direct ETS read — the size of subscriptions without
materialising the snapshot records.
Examples
announcer when: PriceChanged do: [:e | e printNl]
announcer subscriptionCount // => 1
From Object
Return the class of the receiver.
Examples
42 class // => Integer
"hello" class // => String
Test if the receiver is nil. Returns false for all objects except nil.
Examples
42 isNil // => false
nil isNil // => true
Test if the receiver is not nil. Returns true for all objects except nil.
Examples
42 notNil // => true
nil notNil // => false
If the receiver is nil, evaluate nilBlock. Otherwise return self.
Examples
42 ifNil: [0] // => 42
nil ifNil: [0] // => 0
If the receiver is not nil, evaluate notNilBlock with self.
Examples
42 ifNotNil: [:v | v + 1] // => 43
nil ifNotNil: [:v | v + 1] // => nil
If nil, evaluate nilBlock; otherwise evaluate notNilBlock with self.
Examples
42 ifNil: [0] ifNotNil: [:v | v + 1] // => 43
nil ifNil: [0] ifNotNil: [:v | v + 1] // => 0
If not nil, evaluate notNilBlock with self; otherwise evaluate nilBlock.
Examples
42 ifNotNil: [:v | v + 1] ifNil: [0] // => 43
nil ifNotNil: [:v | v + 1] ifNil: [0] // => 0
Return the developer-readable (Debug) string representation.
printString is the Debug protocol (ADR 0094): the self-describing,
structural form used by the REPL, logs, and by any other printString
that nests this object. It is the REPL default — evaluating an expression
shows its printString.
This default returns the bare class name (no a/an article — the
old "a ClassName" form was dropped in ADR 0094). Value overrides it
with the structural ClassName(field: value, ...) form, actors render as
Actor(ClassName, pid), supervisors as Supervisor(ClassName, pid) /
DynamicSupervisor(ClassName, pid), and primitive types (Integer, String,
List, …) override it with their own richer output. Authors rarely override
printString directly — the default is derived.
Examples
42 printString // => "42"
Return the user-facing (Display) string representation.
displayString is the Display protocol (ADR 0094): the human-facing
form. It is the hook the language pulls during string interpolation —
every {...} segment renders via the value's displayString. Developers
rarely call it directly; they override it when a value has a natural
human rendering (e.g. Money → $10.50, where printString would still
show the Debug form).
It defaults to printString, so most types need no override. String
and Symbol demonstrate the split: "hi" printString → "\"hi\""
(quoted, Debug) while "hi" displayString → "hi" (plain, Display);
likewise #foo drops its # prefix under displayString.
displayString is not part of the Printable protocol (deferred per
ADR 0094 §5).
Examples
42 displayString // => "42"
Open a navigable Inspector cursor on the receiver.
ADR 0095 Phase 3 (BT-2504). inspect is repurposed from -> String
(the ADR-0094 deferral) to the verb that produces an Inspector — a
live, immutable cursor for drilling into the object (Inspector on: self).
anObject inspect is the shorthand; Inspector on: anObject is the
explicit spelling. The cursor exposes fields/at:/path/refresh/
printString (an indented text tree) and asDictionaries (the MCP/browser
wire form); see Inspector.
This is a breaking change: code that used inspect for its old
String result must switch to printString (the structural Debug string,
ADR 0094) — a transitional lint flags inspect used directly in ++/
string position.
Examples
42 inspect kind // => #value
(Point x: 3 y: 4) inspect fields size // => 2
(Point x: 3 y: 4) printString // => "Point(x: 3, y: 4)" (the old inspect string)
Return the receiver itself. Useful for cascading side effects.
Examples
42 yourself // => 42
Return a hash value for the receiver.
Examples
42 hash
Test if the receiver responds to the given selector.
Examples
42 respondsTo: #abs // => true
Return the names of fields.
Examples
42 fieldNames // => #()
Return the value of the named field.
Examples
object fieldAt: #name
Set the value of the named field (returns new state).
Examples
object fieldAt: #name put: "Alice"
Send a unary message dynamically.
Examples
42 perform: #abs // => 42
Send a message dynamically with arguments.
Examples
3 perform: #max: withArguments: #(5) // => 5
Raise an error indicating this method must be overridden by a subclass.
Examples
self subclassResponsibility
Raise an error indicating this method has not yet been implemented.
Use this for work-in-progress stubs. Distinct from subclassResponsibility,
which signals an interface contract violation.
Examples
self notImplemented
Send aValue to the current transcript without a trailing newline.
Nil-safe: does nothing when no transcript is set (batch compile, tests).
Examples
42 show: "value: "
Send aValue to the current transcript followed by a newline.
Nil-safe: does nothing when no transcript is set (batch compile, tests).
Examples
42 showCr: "hello world"
Test if the receiver is an instance of aClass or any of its subclasses.
For class-object receivers, follows Smalltalk semantics: self class
is the metaclass, so the check walks the parallel metaclass hierarchy.
The parallel chain is grounded at ProtoObject class superclass == Class
(ADR 0036), so the metaclass tower merges into the instance-side
Class → Behaviour → Object → ProtoObject chain. As a result,
Integer isKindOf: Object and Integer isKindOf: Class both return true.
Examples
42 isKindOf: Integer // => true
42 isKindOf: Object // => true
#foo isKindOf: Symbol // => true
#foo isKindOf: String // => false
Integer isKindOf: Number // => false (metaclass chain, not instance chain)
Integer isKindOf: Number class // => true (Number class is in the parallel chain)
Integer isKindOf: Object // => true (grounded — Object is reachable via the metaclass tower)
Integer isKindOf: Class // => true (Integer class inherits from Class)
Raise an error with the given message.
Examples
self error: "something went wrong"
Delegate message dispatch to the backing Erlang module (ADR 0101, BT-2720).
This method is a sentinel — a plain Object has no backing Erlang module,
so calling delegate raises an Error at runtime. Stateless Objects
declared with native: have their self delegate method bodies rewritten
by the compiler's codegen phase to call the backing module directly, so the
sentinel is never reached on a native: class.
Unlike Actor's delegate (visible only to Actor subclasses), this
Object-base sentinel is visible to every class, so delegate is a
reserved selector on the Object protocol.
Examples
42 delegate // => ERROR: delegate called on a non-native Object
From ProtoObject
Test value equality (Erlang ==).
Examples
42 == 42 // => true
"abc" == "abc" // => true
Test value inequality (negation of ==).
Examples
1 /= 2 // => true
42 /= 42 // => false
Return the class of the receiver.
Examples
42 class // => Integer
"hello" class // => String
Handle messages the receiver does not understand. Override for custom dispatch.
Examples
42 unknownMessage // => ERROR: does_not_understand
Send a message dynamically with an arguments list.
Examples
42 perform: #abs withArguments: #() // => 42
Execute a class method in the caller's process, bypassing gen_server dispatch.
The caller takes responsibility for knowing the method does not mutate class state. Useful for long-running class methods that would otherwise block the class object's gen_server.
Limitations: only resolves methods defined directly on the target class
module (does not walk the superclass chain). Class variables and self
are not available to the method (nil and #{} are passed).
Examples
MyClass performLocally: #run:ctx: withArguments: #(input, ctx)
Send a message dynamically with an arguments list and explicit timeout.
The timeout (in milliseconds or #infinity) applies to the gen_server:call
when the receiver is an actor. For value types, timeout is ignored.
Examples
actor perform: #query withArguments: #(sql) timeout: 30000