Skip to content

TBoldPublisher

TBoldPublisher is the sender side of Bold's subscription (observer) pattern. It manages a list of subscriptions and dispatches events to registered subscribers.

Class Hierarchy

classDiagram
    TBoldMemoryManagedObject <|-- TBoldPublisher
    TBoldPublisher o-- TBoldSubscriber : notifies

    TBoldPublisher : +AddSubscription()
    TBoldPublisher : +AddSmallSubscription()
    TBoldPublisher : +SendEvent()
    TBoldPublisher : +SendQuery()
    TBoldPublisher : +HasSubscribers

    click TBoldSubscriber href "../TBoldSubscriber/" "TBoldSubscriber documentation"

Class Definition

TBoldPublisher = class(TBoldMemoryManagedObject)
public
  constructor Create(var APublisherReference);
  destructor Destroy; override;
  procedure AddSubscription(Subscriber: TBoldSubscriber;
    OriginalEvent: TBoldEvent;
    RequestedEvent: TBoldRequestedEvent = beDefaultRequestedEvent);
  procedure AddSmallSubscription(Subscriber: TBoldSubscriber;
    Events: TBoldSmallEventSet;
    RequestedEvent: TBoldRequestedEvent = beDefaultRequestedEvent);
  procedure SendEvent(OriginalEvent: TBoldEvent);
  procedure SendExtendedEvent(Originator: TObject;
    OriginalEvent: TBoldEvent; const Args: array of const);
  function SendQuery(Originator: TObject; OriginalEvent: TBoldEvent;
    const Args: array of const; Subscriber: TBoldSubscriber): Boolean;
  procedure CancelSubscriptionTo(Subscriber: TBoldSubscriber);
  procedure NotifySubscribersAndClearSubscriptions(Originator: TObject);
  property HasSubscribers: Boolean;
  property SubscriptionCount: Integer;
  property SubscriptionsAsText: string; // debug
end;

Event System

Events are integers (TBoldEvent = 0..100000). Small events (0–29) can be combined in sets for efficient multi-event subscriptions.

Core Event Constants

Event Value Meaning
beDestroying 0 Object being destroyed
beMemberChanged 1 A member value changed
beObjectDeleted 2 Object was deleted
beObjectCreated 3 New object created
beItemAdded 4 Item added to list
beItemDeleted 5 Item removed from list
beItemReplaced 6 Item replaced in list
beValueChanged 8 Attribute or reference value changed
breReSubscribe 10 Request to resubscribe
beValueInvalid 12 Value marked invalid

Event Types

Method Purpose
SendEvent One-way notification — subscribers are informed
SendExtendedEvent Notification with additional arguments
SendQuery Two-way — subscribers can veto the operation

How It Works

sequenceDiagram
    participant P as Publisher
    participant S1 as Subscriber 1
    participant S2 as Subscriber 2

    S1->>P: AddSubscription(beValueChanged)
    S2->>P: AddSmallSubscription([beItemAdded, beItemDeleted])
    Note over P: Value changes...
    P->>S1: Receive(beValueChanged)
    Note over P: Item added...
    P->>S2: Receive(beItemAdded)

Common Patterns

Direct Usage (Rare)

Most Bold objects already embed a publisher via TBoldSubscribableObject or TBoldSubscribableComponent. Direct TBoldPublisher creation is rarely needed:

var
  fPublisher: TBoldPublisher;

constructor TMyClass.Create;
begin
  fPublisher := TBoldPublisher.Create(fPublisher);
end;

// Send events
fPublisher.SendEvent(beValueChanged);

Subscribable Base Classes

In practice, use the convenience methods from subscribable base classes:

// TBoldSubscribableObject provides:
MyObject.AddSubscription(Subscriber, beValueChanged);
MyObject.SendEvent(beValueChanged);

// TBoldSubscribableComponent provides:
MyComponent.AddSmallSubscription(Subscriber, [beItemAdded, beItemDeleted]);

See Also