orber_ifr(3)
orber_ifr π β¨
The Interface Repository stores representations of IDL information
okay bestie, welcome to the module that keeps receipts on all your IDL. this is orber_ifr and it's a whole mood.
NAME π
orber_ifr β the Interface Repository, and it stores representations of IDL information. that's the whole job. she's a record-keeper. an archivist. the girl with the labelled boxes. π
DESCRIPTION πΈ
okay so. this module is where all the functions for managing the Interface Repository live β the IFR, for short. (yes we abbreviate, we're busy.)
big disclaimer before we go any further, no cap: this documentation is meant to be used together with the documentation in chapter 6 of 2.3. don't skip it. she's not optional, she's required reading, iykyk.
and here's the thing that trips people up β whenever this manual page says "IFR object", it does not mean a CORBA object. it means a pseudo object that exists only so you can interact with the IFR. it's giving fake-ID-but-for-objects. π so don't go treating it like a real CORBA object, bestie, because she will not behave like one.
INITIALIZATION OF THE IFR π¦
so like, before you can do literally anything, you gotta set her up. β¨ the functions below initialize the Interface Repository and get you that very first reference to the repository. think of it as, like, unlocking the front door before you can even look at the furniture.
EXPORTS π
init(Nodes,Timeout) -> ok
Types:
Nodes = list()
Timeout = integer() | infinity
call this one to initialize the IFR, periodt. she creates all the mnesia tables you're gonna need. but heads up β a mnesia schema should already exist, and mnesia must be running. no schema, no mnesia, no IFR. that's the vibe check and you already failed it if you skipped that step. π«Ά
find_repository() -> #IFR_Repository_objref
this is how you find the IFR object reference for the Repository. π
use this reference when you're adding objects to the IFR, and when you're extracting info back out of the IFR. both directions. every time.
and the cute part? the first time you call this function, she creates the repository and all the primitive definitions. so like, first call does the heavy lifting, and the rest of the calls just vibe. π
GENERAL METHODS π§
alright so these next ones are the methods of the IFR. and the first argument is always an #IFR_objref β that's the IFR (pseudo)object you're applying the method to. π
now, why would you use these general ones? because they're the ones that work when you don't know what type of IFR object you're holding. mystery object? these functions don't care, they'll figure it out.
but β and this is the tradeoff, bestie β they are somewhat slower than the specific functions listed further down, because those specific ones only accept one particular type of IFR object as the first argument. so it's giving: flexible vs. fast. choose your fighter. β
EXPORTS π
get_def_kind(Objref) -> Return
Types:
Objref = #IFR_objref
Return = atom() (one of dk_none, dk_all, dk_Attribute,
dk_Constant, dk_Exception, dk_Interface, dk_Module,
dk_Operation, dk_Typedef, dk_Alias, dk_Struct, dk_Union,
dk_Enum, dk_Primitive, dk_String, dk_Wstring, dk_Fixed,
dk_Sequence, dk_Array, dk_Repository)
Objref can be an IFR object of any kind, no discrimination here. she hands you back the definition kind of the IFR object. it's the "so what are you?" function. π₯
destroy(Objref) -> Return
Types:
Objref = #IFR_object
Return = tuple()
Objref is an IFR object of any kind β except IRObject, Contained and Container. those three? not invited. π
she destroys that object and its contents (if it has any). and the return value is just whatever mnesia:transaction returns. so like, she's honest about it, she passes the receipt straight through.
get_id(Objref) -> Return
Types:
Objref = #IFR_object
Return = string()
Objref is an IFR object of any kind that inherits from Contained. returns the repository id of that object. the id. the name tag. π·οΈ
set_id(Objref,Id) -> ok
Types:
Objref = #IFR_object
Id = string()
Objref is an IFR object of any kind that inherits from Contained. sets the repository id of that object. you're rebranding her. π
get_name(Objref) -> Return
Types:
Objref = #IFR_object
Return = string()
Objref is an IFR object of any kind that inherits from Contained. returns the name of that object. yes, she knows her own name. icon behaviour. π
set_name(Objref,Name) -> ok
Types:
Objref = #IFR_object
Name = string()
Objref is an IFR object of any kind that inherits from Contained. sets the name of that object.
get_version(Objref) -> Return
Types:
Objref = #IFR_object
Return = string()
Objref is an IFR object of any kind that inherits from Contained. returns the version of that object.
set_version(Objref,Version) -> ok
Types:
Objref = #IFR_object
Version = string()
Objref is an IFR object of any kind that inherits from Contained. sets the version of that object. new version, new me. β¨
get_defined_in(Objref) -> Return
Types:
Objref = #IFR_object
Return = #IFR_Container_objref
Objref is an IFR object of any kind that inherits from Contained. returns the Container object that this object is defined in. it's giving "who's your mother?" π
get_absolute_name(Objref) -> Return
Types:
Objref = #IFR_object
Return = string()
Objref is an IFR object of any kind that inherits from Contained. returns the absolute (scoped) name of that object. the full government name. π
get_containing_repository(Objref) -> Return
Types:
Objref = #IFR_object
Return = #IFR_Repository_objref
Objref is an IFR object of any kind that inherits from Contained. returns the Repository that you eventually reach by recursively following the object's defined_in attribute. yes, recursively. she climbs the whole family tree. π³
describe(Objref) -> Return
Types:
Objref = #IFR_object
Return = tuple() (a contained_description record) |
{exception, _}
Objref is an IFR object of any kind that inherits from Contained. returns a tuple describing the object. or an {exception, _}, if she's feeling dramatic. π
move(Objref,New_container,New_name,New_version) -> Return
Types:
Objref = #IFR_objref
New_container = #IFR_Container_objref
New_name = string()
New_version = string()
Return = ok | {exception, _}
Objref is an IFR object of any kind that inherits from Contained. New_container is an IFR object of any kind that inherits from Container.
she removes Objref from its current Container and adds it to New_container. then the name attribute gets changed to New_name and the version attribute gets changed to New_version. it's a whole relocation arc. main character energy. π
β¨
lookup(Objref,Search_name) -> Return
Types:
Objref = #IFR_objref
Search_name = string()
Return = #IFR_object
Objref is an IFR object of any kind that inherits from Container. returns an IFR object identified by search_name, which is a scoped name. she found her. π
contents(Objref,Limit_type,Exclude_inherited) -> Return
Types:
Objref = #IFR_objref
Limit_type = atom() (one of dk_none, dk_all, dk_Attribute,
dk_Constant, dk_Exception, dk_Interface, dk_Module,
dk_Operation, dk_Typedef, dk_Alias, dk_Struct, dk_Union,
dk_Enum, dk_Primitive, dk_String, dk_Wstring, dk_Fixed,
dk_Sequence, dk_Array, dk_Repository)
Exclude_inherited = atom() (true or false)
Return = list() (a list of IFR#_objects)
Objref is an IFR object of any kind that inherits from Container. returns the contents of that IFR object. dump the whole bag out on the bed. π
lookup_name(Objref,Search_name,Levels_to_search, Limit_type, Exclude_inherited) -> Return
Types:
Objref = #IFR_objref
Search_name = string()
Levels_to_search = integer()
Limit_type = atom() (one of dk_none, dk_all, dk_Attribute,
dk_Constant, dk_Exception, dk_Interface, dk_Module,
dk_Operation, dk_Typedef, dk_Alias, dk_Struct, dk_Union,
dk_Enum, dk_Primitive, dk_String, dk_Wstring, dk_Fixed,
dk_Sequence, dk_Array, dk_Repository)
Exclude_inherited = atom() (true or false)
Return = list() (a list of #IFR_objects)
Objref is an IFR object of any kind that inherits from Container. returns a list of #IFR_objects with an id matching Search_name. and you get to say how many Levels_to_search. deep dive or surface level, your call. π
describe_contents(Objref, Limit_type, Exclude_inherited, Max_returned_objs) -> Return
Types:
Objref = #IFR_objref
Limit_type = atom() (one of dk_none, dk_all, dk_Attribute,
dk_Constant, dk_Exception, dk_Interface, dk_Module,
dk_Operation, dk_Typedef, dk_Alias, dk_Struct, dk_Union,
dk_Enum, dk_Primitive, dk_String, dk_Wstring, dk_Fixed,
dk_Sequence, dk_Array, dk_Repository)
Exclude_inherited = atom() (true or false)
Return = list() (a list of tuples (contained_description
records) | {exception, _}
Objref is an IFR object of any kind that inherits from Container. returns a list of descriptions of the IFR objects sitting in this Container's contents. and yeah, Max_returned_objs is doing exactly what it sounds like. π
create_module(Objref,Id,Name,Version) -> Return
Types:
Objref = #IFR_objref
Id = string()
Name = string()
Version = string()
Return = #IFR_ModuleDef_objref
Objref is an IFR object of any kind that inherits from Container. creates an IFR object of the type ModuleDef. β¨
create_constant(Objref,Id,Name,Version,Type,Value) -> Return
Types:
Objref = #IFR_objref
Id = string()
Name = string()
Version = string()
Type = #IFR_IDLType_objref
Value = any()
Return = #IFR_ConstantDef_objref
Objref is an IFR object of any kind that inherits from Container. creates an IFR object of the type ConstantDef. and Value can be any(), so like, go off. π
create_struct(Objref,Id,Name,Version,Members) -> Return
Types:
Objref = #IFR_objref
Id = string()
Name = string()
Version = string()
Members = list() (list of structmember records)
Return = #IFR_StructDef_objref
Objref is an IFR object of any kind that inherits from Container. creates an IFR object of the type StructDef. Members is a list of structmember records, fr fr. π¦
create_union(Objref,Id,Name,Version,Discriminator_type,Members) -> Return
Types:
Objref = #IFR_objref
Id = string()
Name = string()
Version = string()
Discriminator_type = #IFR_IDLType_Objref
Members = list() (list of unionmember records)
Return = #IFR_UnionDef_objref
Objref is an IFR object of any kind that inherits from Container. creates an IFR object of the type UnionDef. note the Discriminator_type is an #IFR_IDLType_Objref, and Members is a list of unionmember records. πΈ
create_enum(Objref,Id,Name,Version,Members) -> Return
Types:
Objref = #IFR_objref
Id = string()
Name = string()
Version = string()
Members = list() (list of strings)
Return = #IFR_EnumDef_objref
Objref is an IFR object of any kind that inherits from Container. creates an IFR object of the type EnumDef. here Members is just a list of strings, lowkey the easiest one. π
create_alias(Objref,Id,Name,Version,Original_type) -> Return
Types:
Objref = #IFR_objref
Id = string()
Name = string()
Version = string()
Original_type = #IFR_IDLType_Objref
Return = #IFR_AliasDef_objref
Objref is an IFR object of any kind that inherits from Container. creates an IFR object of the type AliasDef, with Original_type being an #IFR_IDLType_Objref. π«Ά
and that's part one bestie, we are SO not done β more coming π
Objref is any IFR object that inherits from Container, and it hands you back a brand-new IFR object of the type AliasDef. β¨
create_interface(Objref,Id,Name,Version,Base_interfaces) -> Return
Types:
Objref = #IFR_objref
Id = string()
Name = string()
Version = string()
Base_interfaces = list() (a list of IFR_InterfaceDef_objrefs that this interface inherits from
Return = #IFR_InterfaceDef_objref
Objref = any IFR object that inherits from Container. This one builds you an IFR object of the type InterfaceDef. π
create_exception(Objref,Id,Name,Version,Members) -> Return
Types:
Objref = #IFR_objref
Id = string()
Name = string()
Version = string()
Members = list() (list of structmember records)
Return = #IFR_ExceptionDef_objref
Objref = any IFR object that inherits from Container. Spins up an IFR object of the type ExceptionDef. π«Ά
get_type(Objref) -> Return
Types:
Objref = #IFR_objref
Return = tuple() (a typecode tuple)
Objref has to be an IFR object of any kind that inherits from IDLType, or an IFR object of the kind ConstantDef, ExceptionDef or AttributeDef. Gives you back the typecode of that IFR object. π¦
lookup_id(Objref,Search_id) -> Return
Types:
Objref = #IFR_Repository_objref
Search_id = string()
Return = #IFR_objref
Hands you the IFR object that matches Search_id. π
get_primitive(Objref,Kind) -> Return
Types:
Objref = #IFR_Repository_objref
Kind = atom() (one of pk_null, pk_void, pk_short, pk_long,
pk_ushort, pk_ulong, pk_float, pk_double, pk_boolean, pk_char,
pk_octet, pk_any, pk_TypeCode, pk_Principal, pk_string,
pk_wstring, pk_fixed, pk_objref)
Return = #IFR_PrimitiveDef_objref
Returns a PrimitiveDef of whatever kind you asked for. Pick your fighter from that atom list, bestie. π
create_string(Objref,Bound) -> Return
Types:
Objref = #IFR_Repository_objref
Bound = integer() (unsigned long /= 0)
Return = #IFR_StringDef_objref
Creates an IFR objref of the type StringDef. π
create_wstring(Objref,Bound) -> Return
Types:
Objref = #IFR_Repository_objref
Bound = integer() (unsigned long /= 0)
Return = #IFR_WstringDef_objref
Creates an IFR objref of the type WstringDef. π
create_fixed(Objref,Digits,Scale) -> Return
Types:
Objref = #IFR_Repository_objref
Digits = Scale = integer()
Return = #IFR_FixedDef_objref
Creates an IFR objref of the type FixedDef. Both Digits and Scale are integers, yes ma'am. β¨
create_sequence(Objref,Bound,Element_type) -> Return
Types:
Objref = #IFR_Repository_objref
Bound = integer() (unsigned long)
Element_type = #IFR_IDLType_objref
Return = #IFR_SequenceDef_objref
Creates an IFR objref of the type SequenceDef. π§
create_array(Objref,Length,Element_type) -> Return
Types:
Objref = #IFR_Repository_objref
Bound = integer() (unsigned long)
Element_type = #IFR_IDLType_objref
Return = #IFR_ArrayDef_objref
Creates an IFR objref of the type ArrayDef. πΈ
create_idltype(Objref,Typecode) -> Return
Types:
Objref = #IFR_Repository_objref
Typecode = tuple() (a typecode tuple)
Return = #IFR_IDLType_objref
Creates an IFR objref of the type IDLType. π₯
get_type_def(Objref) -> Return
Types:
Objref = #IFR_objref
Return = #IFR_IDLType_objref
Objref has to be an IFR object of the kind ConstantDef or AttributeDef. You get back an IFR object of the type IDLType that describes the type of the IFR object. π
set_type_def(Objref,TypeDef) -> Return
Types:
Objref = #IFR_objref
TypeDef = #IFR_IDLType_objref
Return = ok | {exception, _}
Objref = an IFR object of the kind ConstantDef or AttributeDef. Sets the type_def of the IFR object. π
get_value(Objref) -> Return
Types:
Objref = #IFR_ConstantDef_objref
Return = any()
Returns the value attribute of an IFR object of the type ConstantDef. π
set_value(Objref,Value) -> Return
Types:
Objref = #IFR_ConstantDef_objref
Value = any()
Return = ok | {exception, _}
Sets the value attribute of an IFR object of the type ConstantDef. β¨
get_members(Objref) -> Return
Types:
Objref = #IFR_objref
Return = list()
Objref is an IFR object of the kind StructDef, UnionDef, EnumDef or ExceptionDef. For StructDef, UnionDef and ExceptionDef: you get a list of structmember records, which are the constituent parts of the object. For EnumDef: you get a list of strings describing the enumerations. Two flavours, one function, iconic. π
set_members(Objref,Members) -> Return
Types:
Objref = #IFR_objref
Members = list()
Return = ok | {exception, _}
Objref is an IFR object of the kind StructDef, UnionDef, EnumDef or ExceptionDef. For StructDef, UnionDef and ExceptionDef: Members is a list of structmember records. For EnumDef: Members is a list of strings describing the enumerations. It sets the members attribute, which are the constituent parts of the exception. π
get_discriminator_type(Objref) -> Return
Types:
Objref = #IFR_UnionDef_objref
Return = tuple() (a typecode tuple)
Returns the discriminator typecode of an IFR object of the type UnionDef. π
get_discriminator_type_def(Objref) -> Return
Types:
Objref = #IFR_UnionDef_objref
Return = #IFR_IDLType_objref
Returns an IFR object of the type IDLType describing the discriminator type of an IFR object of the type UnionDef. π¦
set_discriminator_type_def(Objref,TypeDef) -> Return
Types:
Objref = #IFR_UnionDef_objref
Return = #IFR_IDLType_objref
Sets the attribute discriminator_type_def, an IFR object of the type IDLType describing the discriminator type of an IFR object of the type UnionDef. π
get_original_type_def(Objref) -> Return
Types:
Objref = #IFR_AliasDef_objref
Return = #IFR_IDLType_objref
Returns an IFR object of the type IDLType describing the original type. β¨
set_original_type_def(Objref,TypeDef) -> Return
Types:
Objref = #IFR_AliasDef_objref
Typedef = #IFR_IDLType_objref
Return = ok | {exception, _}
Sets the original_type_def attribute, which describes the original type. π
get_kind(Objref) -> Return
Types:
Objref = #IFR_PrimitiveDef_objref
Return = atom()
Returns an atom describing the primitive type (See CORBA 2.0 p 6-21). π
get_bound(Objref) -> Return
Types:
Objref = #IFR_objref
Return = integer (unsigned long)
Objref is an IFR object of the kind StringDef or SequenceDef. For StringDef: returns the maximum number of characters in the string. For SequenceDef: returns the maximum number of elements in the sequence. Zero means an unbounded sequence. π
set_bound(Objref,Bound) -> Return
Types:
Objref = #IFR_objref
Bound = integer (unsigned long)
Return = ok | {exception, _}
Objref is an IFR object of the kind StringDef or SequenceDef. For StringDef: sets the maximum number of characters in the string. Bound must not be zero. For SequenceDef: sets the maximum number of elements in the sequence. Zero indicates an unbounded sequence. π«Ά
get_element_type(Objref) -> Return
Types:
Objref = #IFR_objref
Return = tuple() (a typecode tuple)
Objref is an IFR object of the kind SequenceDef or ArrayDef. Returns the typecode of the elements in the IFR object. β
get_element_type_def(Objref) -> Return
Types:
Objref = #IFR_objref
Return = #IFR_IDLType_objref
Objref is an IFR object of the kind SequenceDef or ArrayDef. Returns an IFR object of the type IDLType describing the type of the elements in Objref. π¦
set_element_type_def(Objref,TypeDef) -> Return
Types:
Objref = #IFR_objref
TypeDef = #IFR_IDLType_objref
Return = ok | {exception, _}
Objref is an IFR object of the kind SequenceDef or ArrayDef. Sets the element_type_def attribute, an IFR object of the type IDLType describing the type of the elements in Objref. π
get_length(Objref) -> Return
Types:
Objref = #IFR_ArrayDef_objref
Return = integer() (unsigned long)
Returns the number of elements in the array. π’
set_length(Objref,Length) -> Return
Types:
Objref = #IFR_ArrayDef_objref
Length = integer() (unsigned long)
Sets the number of elements in the array. β¨
get_mode(Objref) -> Return
Types:
Objref = #IFR_objref
Return = atom()
Objref is an IFR object of the kind AttributeDef or OperationDef. For AttributeDef: Return is an atom ('ATTR_NORMAL' or 'ATTR_READONLY') specifying the read/write access for this attribute. For OperationDef: Return is an atom ('OP_NORMAL' or 'OP_ONEWAY') specifying the mode of the operation. π
set_mode(Objref,Mode) -> Return
Types:
Objref = #IFR_objref
Mode = atom()
Return = ok | {exception, _}
Objref is an IFR object of the kind AttributeDef or OperationDef. For AttributeDef: sets the read/write access for this attribute. Mode is an atom ('ATTR_NORMAL' or 'ATTR_READONLY'). For OperationDef: sets the mode of the operation. Mode is an atom ('OP_NORMAL' or 'OP_ONEWAY'). π
get_result(Objref) -> Return
Types:
Objref = #IFR_OperationDef_objref
Return = tuple() (a typecode tuple)
Returns a typecode describing the type of the value returned by the operation. π₯
get_result_def(Objref) -> Return
Types:
okay so the page literally cuts off right there mid-entry, not me, that's just the manpage π
Types: Objref = #IFR_OperationDef_objref, Return = #IFR_IDLType_objref
Hands you back an IFR object of the type IDLType that describes the type of the result. π
set_result_def(Objref,ResultDef) -> Returnβ sets thetype_defattribute, an IFR Object of the typeIDLTypedescribing the result.- Types:
Objref=#IFR_OperationDef_objref;ResultDef=#IFR_IDLType_objref;Return=ok | {exception, _}
- Types:
get_params(Objref) -> Returnβ gives you a list of parameter description records, which describes the parameters of theOperationDef. the receipts, basically π- Types:
Objref=#IFR_OperationDef_objref;Return=list()(list of parameter description records)
- Types:
set_params(Objref,Params) -> Returnβ sets theparamsattribute, a list of parameter description records.- Types:
Objref=#IFR_OperationDef_objref;Params=list()(list of parameter description records);Return=ok | {exception, _}
- Types:
get_contexts(Objref) -> Returnβ returns a list of context identifiers for the operation. π¦- Types:
Objref=#IFR_OperationDef_objref;Return=list()(list of strings)
- Types:
set_contexts(Objref,Contexts) -> Returnβ sets thecontextattribute for the operation.- Types:
Objref=#IFR_OperationDef_objref;Contexts=list()(list of strings);Return=ok | {exception, _}
- Types:
get_exceptions(Objref) -> Returnβ returns a list of exception types that can be raised by this operation. the drama potential, we love to see it π- Types:
Objref=#IFR_OperationDef_objref;Return=list()(list of#IFR_ExceptionDef_objrefs)
- Types:
set_exceptions(Objref,Exceptions) -> Returnβ sets theexceptionsattribute for this operation.- Types:
Objref=#IFR_OperationDef_objref;Exceptions=list()(list of#IFR_ExceptionDef_objrefs);Return=ok | {exception, _}
- Types:
get_base_interfaces(Objref) -> Returnβ returns a list ofInterfaceDefs from which thisInterfaceDefinherits. it's giving ancestry dot com π§¬- Types:
Objref=#IFR_InterfaceDef_objref;Return=list()(list of#IFR_InterfaceDef_objrefs)
- Types:
set_base_interfaces(Objref,BaseInterfaces) -> Returnβ sets theBaseInterfacesattribute.- Types:
Objref=#IFR_InterfaceDef_objref;BaseInterfaces=list()(list of#IFR_InterfaceDef_objrefs);Return=ok | {exception, _}
- Types:
is_a(Objref,Interface_id) -> Returnβ returnstrueif theInterfaceDefeither is identical to or inherits fromInterface_id. glow-up check β¨- Types:
Objref=#IFR_InterfaceDef_objref;Interface_id=#IFR_InterfaceDef_objref;Return=atom()(trueorfalse)
- Types:
describe_interface(Objref) -> Returnβ returns a full inter face description record describing theInterfaceDef. the whole lore drop π- Types:
Objref=#IFR_InterfaceDef_objref;Return=tuple()(afullinterfacedescriptionrecord)
- Types:
create_attribute(Objref,Id,Name,Version,Type,Mode) -> Returnβ creates an IFR object of the typeAttributeDefcontained in thisInterfaceDef.- Types:
Objref=#IFR_InterfaceDef_objref;Id=string();Name=string();Version=string();Type=#IFR_IDLType_objref;Mode=atom()('ATTR_NORMAL'or'ATTR_READONLY');Return=#IFR_AttributeDef_objref
- Types:
create_operation(Objref,Id,Name,Version,Result,Mode,Params, Exceptions,Contexts) -> Returnβ creates an IFR object of the typeOperationDefcontained in thisInterfaceDef. main character creation moment π- Types:
Objref=#IFR_InterfaceDef_objref;Id=string();Name=string();Version=string();Result=#IFR_IDLType_objref;Mode=atom()('OP_NORMAL'or'OP_ONEWAY');Params=list()(list of parameter description records);Exceptions=list()(list of#IFR_ExceptionDef_objrefs);Contexts=list()(list of strings);Return=#IFR_OperationDef_objref
- Types:
Heads up bestie: the twoModeatoms are case-sensitive and quoted, so write them exactly like'ATTR_NORMAL','ATTR_READONLY','OP_NORMAL','OP_ONEWAY'. no vibing your way through those π
And that's the whole page, fr fr π«Ά
This one's brought to you by Ericsson AB, straight outta the orber 5.2.2 era, and it's the orber_ifr(3) page β go build something iconic with it. periodt. πβ¨π
π¦ where this page comes from
- fedora 43: erlang-orber 1:5.2.2-1.fc43 Β· Apache-2.0
- fedora 44: erlang-orber 1:5.2.2-1.fc44 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms