Module: environment-protocols Synopsis: Environment protocols Author: Andy Armstrong 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 /// User objects define class (, ) end class ; define open generic user-object-slot-values (server :: , object :: ) => (functions :: , values :: ); /// Internal objects // // A special subclass of whose contents is only of // interest to internal developers (or expert external developers) define class () end class ; /// Project dispatching methods define method user-object-slot-values (project :: , object :: ) => (functions :: , values :: ) let application = project-application(project); if (application) user-object-slot-values(application, object) else values(#(), #()) end end method user-object-slot-values; define method environment-object-type-name (object :: ) => (name :: ) "Instance" end method environment-object-type-name; /// Support for defining subclasses of define constant $user-object-classes = make(); define sealed class () sealed constant slot user-class-info-class :: , required-init-keyword: class:; sealed constant slot user-class-info-id :: , required-init-keyword: id:; end class ; define function user-object-class-mappings () => (mappings :: ) $user-object-classes end function user-object-class-mappings; //---*** We should partial order these, but for the moment we should //---*** just ensure that they get added in the correct order. define function register-user-object-class (class :: subclass(), name :: , module-name :: , library-name :: ) => () let library = make(, name: library-name); let module = make(, name: module-name, library: library); let id = make(, name: name, module: module); add-new!($user-object-classes, make(, class: class, id: id)) end function register-user-object-class; define macro user-object-class-definer { define user-object-class ?name:name (?superclasses:*) binding ?class-name:name, module: ?module-name:name, library: ?library-name:name; end } => { define sealed class ?name (?superclasses) end class ?name; register-user-object-class (?name, ?"class-name", ?"module-name", ?"library-name"); } end macro user-object-class-definer;