module: dfmc-common
Author: Jonathan Bachrach
Copyright:    Original Code is Copyright (c) 1995-2004 Functional Objects, Inc.
              All rights reserved.
License:      Functional Objects Library Public License Version 1.0
Dual-license: GNU Lesser General Public License
Warranty:     Distributed WITHOUT WARRANTY OF ANY KIND

/// DEFAULTS

define compiler-open generic add-user! (o, user);
define compiler-open generic remove-user! (o, user);

define method add-user! (o, user)
end method;

define method remove-user! (o, user)
end method;

define method users (o) => (res :: <empty-list>)
  #()
end method;

/// REFERENCED-OBJECT

define abstract compiler-open dood-class <referenced-object> (<object>)
  /* JB weak */ slot users :: <list> = #(), 
    // reinit-expression: #(),
    init-keyword: users:;
end;

define method used? (o :: <referenced-object>) => (res :: <boolean>)
  ~empty?(o.users)
end method;

define method used-once? (o :: <referenced-object>)
  o.users.size = 1
end method;

define method references (o :: <referenced-object>) => (res :: <list>)
  o.users
end method;

define method add-user! (o :: <referenced-object>, user)
  o.users := add!(o.users, user);
end method;

define method remove-user! (o :: <referenced-object>, user)
  o.users := remove!(o.users, user, count: 1);
end method;

// eof