OpenRTM-aist
1.2.1
|
#include <Manager.h>
Classes | |
struct | ECFactoryPredicate |
class | FactoryPredicate |
struct | Finalized |
struct | InstanceName |
struct | ModuleFactories |
class | ModulePredicate |
class | OrbRunner |
OrbRunner class. More... | |
struct | Term |
class | Terminator |
Terminator class. More... | |
Public Member Functions | |
void | terminate () |
Terminate manager. More... | |
void | shutdown () |
Shutdown Manager. More... | |
void | join () |
Wait for Manager's termination. More... | |
LogStreamBuf & | getLogStreamBuf () |
Get the log buffer. More... | |
std::string & | getLogLevel () |
Get the log level of the configuration. More... | |
coil::Properties & | getConfig () |
Get the manager configuration. More... | |
void | setModuleInitProc (ModuleInitProc proc) |
Set initial procedure. More... | |
bool | activateManager () |
Activate the Manager. More... | |
void | runManager (bool no_block=false) |
Run the Manager. More... | |
ReturnCode_t | load (const std::string &fname, const std::string &initfunc) |
[CORBA interface] Load module More... | |
void | unload (const char *fname) |
Unload module. More... | |
void | unloadAll () |
Unload all modules. More... | |
std::vector< coil::Properties > | getLoadedModules () |
Get a list of loaded modules. More... | |
std::vector< coil::Properties > | getLoadableModules () |
Get a list of loadable modules. More... | |
bool | registerFactory (coil::Properties &profile, RtcNewFunc new_func, RtcDeleteFunc delete_func) |
Register RT-Component Factory. More... | |
std::vector< coil::Properties > | getFactoryProfiles () |
Get profiles of factories. More... | |
bool | registerECFactory (const char *name, ECNewFunc new_func, ECDeleteFunc delete_func) |
Register ExecutionContext Factory. More... | |
std::vector< std::string > | getModulesFactories () |
Get the list of all Factories. More... | |
RTObject_impl * | createComponent (const char *comp_args) |
Create RT-Components. More... | |
ExecutionContextBase * | createContext (const char *ec_args) |
Create Context. More... | |
void | cleanupComponent (RTObject_impl *comp) |
Unregister RT-Components. More... | |
void | cleanupComponents () |
This method deletes RT-Components. More... | |
void | notifyFinalized (RTObject_impl *comp) |
This method deletes RT-Components. More... | |
bool | registerComponent (RTObject_impl *comp) |
Register RT-Component directly without Factory. More... | |
bool | unregisterComponent (RTObject_impl *comp) |
Unregister RT-Components. More... | |
void | deleteComponent (RTObject_impl *comp) |
Unregister RT-Components that have been registered to Manager. More... | |
void | deleteComponent (const char *instance_name) |
Unregister RT-Components that have been registered to Manager. More... | |
RTObject_impl * | getComponent (const char *instance_name) |
Get RT-Component's pointer. More... | |
std::vector< RTObject_impl * > | getComponents () |
Get all RT-Components registered in the Manager. More... | |
void | addManagerActionListener (RTM::ManagerActionListener *listener, bool autoclean=true) |
void | removeManagerActionListener (RTM::ManagerActionListener *listener) |
void | addModuleActionListener (RTM::ModuleActionListener *listener, bool autoclean=true) |
void | removeModuleActionListener (RTM::ModuleActionListener *listener) |
void | addRtcLifecycleActionListener (RTM::RtcLifecycleActionListener *listener, bool autoclean=true) |
void | removeRtcLifecycleActionListener (RTM::RtcLifecycleActionListener *listener) |
void | addNamingActionListener (RTM::NamingActionListener *listener, bool autoclean=true) |
void | removeNamingActionListener (RTM::NamingActionListener *listener) |
void | addLocalServiceActionListener (RTM::LocalServiceActionListener *listener, bool autoclean=true) |
void | removeLocalServiceActionListener (RTM::LocalServiceActionListener *listener) |
CORBA::ORB_ptr | theORB () |
Get the pointer to ORB (ownership retained) More... | |
CORBA::ORB_ptr | getORB () |
Get the pointer to ORB (ownership duplicated) More... | |
PortableServer::POA_ptr | thePOA () |
Get a pointer to RootPOA held by Manager. More... | |
PortableServer::POA_ptr | getPOA () |
Get a pointer to RootPOA held by Manager. More... | |
PortableServer::POAManager_ptr | thePOAManager () |
Get POAManager that Manager has (ownership retained) More... | |
PortableServer::POAManager_ptr | getPOAManager () |
Get POAManager that Manager has (ownership duplicated) More... | |
RTM::ManagerServant & | getManagerServant () |
Getting ManagerServant. More... | |
bool | initLocalService () |
LocalService initialization. More... | |
NamingManager * | getNaming () |
Getting NamingManager. More... | |
Static Public Member Functions | |
static Manager * | init (int argc, char **argv) |
Initialize manager. More... | |
static Manager & | instance () |
Get instance of the manager. More... | |
Protected Types | |
typedef ObjectManager< std::string, RTObject_impl, InstanceName > | ComponentManager |
typedef ObjectManager< const coil::Properties, FactoryBase, FactoryPredicate > | FactoryManager |
ComponentFactory. More... | |
typedef ObjectManager< const char *, ECFactoryBase, ECFactoryPredicate > | ECFactoryManager |
Protected Member Functions | |
Manager () | |
Protected Constructor. More... | |
Manager (const Manager &manager) | |
Protected Copy Constructor. More... | |
void | initManager (int argc, char **argv) |
Manager internal initialization. More... | |
void | shutdownManager () |
Shutdown Manager. More... | |
void | shutdownOnNoRtcs () |
Shutdown Manager. More... | |
void | initLogstreamFile () |
void | initLogstreamPlugins () |
void | initLogstreamOthers () |
bool | initLogger () |
System logger initialization. More... | |
void | shutdownLogger () |
System Logger finalization. More... | |
bool | initORB () |
CORBA ORB initialization. More... | |
std::string | createORBOptions () |
Create ORB command options. More... | |
void | createORBEndpoints (coil::vstring &endpoints) |
Create Endpoints. More... | |
void | createORBEndpointOption (std::string &opt, coil::vstring &endpoint) |
Create a command optional line of Endpoint of ORB. More... | |
void | shutdownORB () |
ORB finalization. More... | |
bool | initNaming () |
NamingManager initialization. More... | |
void | shutdownNaming () |
NamingManager finalization. More... | |
NamingManager & | getNamingManager () |
Getting NamingManager. More... | |
void | shutdownComponents () |
NamingManager finalization. More... | |
bool | procComponentArgs (const char *comp_arg, coil::Properties &comp_id, coil::Properties &comp_conf) |
Extracting component type/properties from the given string. More... | |
bool | procContextArgs (const char *ec_args, std::string &ec_id, coil::Properties &ec_conf) |
Extracting ExecutionContext's name/properties from the given string. More... | |
void | configureComponent (RTObject_impl *comp, const coil::Properties &prop) |
Configure RT-Component. More... | |
bool | initExecContext () |
ExecutionContextManager initialization. More... | |
bool | initComposite () |
PeriodicECSharedComposite initialization. More... | |
bool | initFactories () |
Factories initialization. More... | |
void | initCpuAffinity () |
void | initPreConnection () |
void | initPreActivation () |
void | initPreCreation () |
void | invokeInitProc () |
void | publishPorts (RTObject_impl *comp) |
void | subscribePorts (RTObject_impl *comp) |
PortServiceList_var | getPortsOnNameServers (std::string nsname, std::string kind) |
void | connectDataPorts (PortService_ptr port, PortServiceList_var &target_ports) |
void | connectServicePorts (PortService_ptr port, PortServiceList_var &target_ports) |
bool | initTimer () |
Timer initialization. More... | |
bool | initManagerServant () |
ManagerServant initialization. More... | |
bool | mergeProperty (coil::Properties &prop, const char *file_name) |
Merge property information. More... | |
std::string | formatString (const char *naming_format, coil::Properties &prop) |
Construct registration information when registering to Naming server. More... | |
void | setEndpointProperty (CORBA::Object_ptr objref) |
Setting endpoint info from corba.endpoints. More... | |
void | endpointPropertySwitch (const std::string &ipver, bool &ip, std::vector< int > &ip_list) |
Getting option info from corba.endpoint_property. More... | |
Protected Attributes | |
RTM::ManagerServant * | m_mgrservant |
The pointer to the ManagerServant. More... | |
CORBA::ORB_var | m_pORB |
The pointer to the ORB. More... | |
PortableServer::POA_var | m_pPOA |
The pointer to the POA. More... | |
PortableServer::POAManager_var | m_pPOAManager |
The pointer to the POAManager. More... | |
ModuleInitProc | m_initProc |
User's initialization function's pointer. More... | |
coil::Properties | m_config |
Managaer's configuration Properties. More... | |
ModuleManager * | m_module |
The pointer to the ModuleManager. More... | |
NamingManager * | m_namingManager |
The pointer to the NamingManager. More... | |
coil::Timer * | m_timer |
Timer Object. More... | |
LogStreamBuf | m_logStreamBuf |
Logger buffer. More... | |
Logger | rtclog |
Logger stream. More... | |
std::vector< std::filebuf * > | m_logfiles |
Files for log output. More... | |
ComponentManager | m_compManager |
ComponentManager. More... | |
FactoryManager | m_factory |
ComponentManager. More... | |
ECFactoryManager | m_ecfactory |
ExecutionContext Manager. More... | |
std::vector< ExecutionContextBase * > | m_ecs |
ExecutionContext list. More... | |
OrbRunner * | m_runner |
The pointer to ORB helper class. More... | |
Terminator * | m_terminator |
The pointer to ORB termination helper class. More... | |
Term | m_terminate |
Synchronous flag for manager termination. More... | |
Finalized | m_finalized |
::RTM::ManagerActionListeners | m_listeners |
Static Protected Attributes | |
static Manager * | manager |
The pointer to the Manager. More... | |
static Mutex | mutex |
The mutex of the pointer to the Manager. More... | |
Manager class.
This is a manager class that manages various information such as components.
|
protected |
|
protected |
|
protected |
ComponentFactory.
|
protected |
Protected Constructor.
Protected Constructor
|
protected |
Protected Copy Constructor.
Protected Copy Constructor
manager | Manager object of copy source |
bool RTC::Manager::activateManager | ( | ) |
Activate the Manager.
This operation do the following:
This operation should be invoked after Manager:init(), and before runManager().
void RTC::Manager::addLocalServiceActionListener | ( | RTM::LocalServiceActionListener * | listener, |
bool | autoclean = true |
||
) |
void RTC::Manager::addManagerActionListener | ( | RTM::ManagerActionListener * | listener, |
bool | autoclean = true |
||
) |
void RTC::Manager::addModuleActionListener | ( | RTM::ModuleActionListener * | listener, |
bool | autoclean = true |
||
) |
void RTC::Manager::addNamingActionListener | ( | RTM::NamingActionListener * | listener, |
bool | autoclean = true |
||
) |
void RTC::Manager::addRtcLifecycleActionListener | ( | RTM::RtcLifecycleActionListener * | listener, |
bool | autoclean = true |
||
) |
void RTC::Manager::cleanupComponent | ( | RTObject_impl * | comp | ) |
Unregister RT-Components.
Unregister specified RT-Component's instances from naming service.
comp | Target RT-Components for the unregistration |
void RTC::Manager::cleanupComponents | ( | ) |
This method deletes RT-Components.
This method deletes RT-Components registered by notifyFinalized().
|
protected |
Configure RT-Component.
Read property files described each RT-Component's type and instance, and configure it to the component. Also, get each component's registered name when registering to NamingService and configure it.
comp | Target RT-Component for the configuration |
|
protected |
port | |
target_ports |
|
protected |
port | |
target_ports |
RTObject_impl* RTC::Manager::createComponent | ( | const char * | comp_args | ) |
Create RT-Components.
Create specified RT-Component's instances via registered Factory. When its instances have been created successfully, the following processings are also executed.
module_name | Target RT-Component names for the creation |
ExecutionContextBase* RTC::Manager::createContext | ( | const char * | ec_args | ) |
Create Context.
|
protected |
Create a command optional line of Endpoint of ORB.
opt | ORB options |
endpoint | Endpoints list |
|
protected |
Create Endpoints.
Create Endpoints from the configuration.
endpoints | Endpoints list |
|
protected |
Create ORB command options.
Create ORB launch options from configuration information that has been set.
void RTC::Manager::deleteComponent | ( | RTObject_impl * | comp | ) |
Unregister RT-Components that have been registered to Manager.
Unregister RT-Components that have been registered to manager Remove specified RT-Component from naming service, terminate itself and release its instances.
comp | Target RT-Component's instances for the unregistration |
void RTC::Manager::deleteComponent | ( | const char * | instance_name | ) |
Unregister RT-Components that have been registered to Manager.
Unregister RT-Components that have been registered to manager Remove specified RT-Component from naming service, terminate itself and release its instances.
instance_name | Target RT-Component's instances for the unregistration |
|
protected |
Getting option info from corba.endpoint_property.
|
protected |
Construct registration information when registering to Naming server.
Construct information when registering to NameServer based on specified format and property information. Each format specification character means as follows:
naming_format | Format specification for NamingService registration |
prop | Property information that is used |
RTObject_impl* RTC::Manager::getComponent | ( | const char * | instance_name | ) |
Get RT-Component's pointer.
Search RT-Component that has been registered to Manager by its specified name, and get it that matches.
instance_name | Target RT-Component's name for searching |
std::vector<RTObject_impl*> RTC::Manager::getComponents | ( | ) |
|
inline |
Get the manager configuration.
Get the manager configuration that has been set to manager.
std::vector<coil::Properties> RTC::Manager::getFactoryProfiles | ( | ) |
Get profiles of factories.
Get profiles of factories.
std::vector<coil::Properties> RTC::Manager::getLoadableModules | ( | ) |
Get a list of loadable modules.
Get loadable module list. (Currently, unimplemented on ModuleManager side)
std::vector<coil::Properties> RTC::Manager::getLoadedModules | ( | ) |
Get a list of loaded modules.
Get module list that is currently loaded into manager.
|
inline |
Get the log level of the configuration.
Get the log level of the configuration.
|
inline |
Get the log buffer.
Get the log buffer that has been set to manager.
RTM::ManagerServant& RTC::Manager::getManagerServant | ( | ) |
Getting ManagerServant.
std::vector<std::string> RTC::Manager::getModulesFactories | ( | ) |
Get the list of all Factories.
Get the list of all factories that have been registered.
NamingManager* RTC::Manager::getNaming | ( | ) |
Getting NamingManager.
|
protected |
Getting NamingManager.
CORBA::ORB_ptr RTC::Manager::getORB | ( | ) |
Get the pointer to ORB (ownership duplicated)
Get the pointer to ORB that has been set to Manager. The ownership is copied (the reference count is incremented.), calling side also obtains reference ownership. The obtained reference must be released after use. Usually it is recommended that return value are assigned to _var type variables are wonership would be released automatically.
{ CORBA::ORB_var orb = Manager::instance().getORB(); orb->string_to_object(<IOR string>); } // ORB's reference in orb is released here.
Referenced by CORBA_SeqUtil::refToVstring().
PortableServer::POA_ptr RTC::Manager::getPOA | ( | ) |
Get a pointer to RootPOA held by Manager.
Get the pointer to RootPOA that has been set to Manager. The ownership is copied (the reference count is incremented.), calling side also obtains reference ownership. The obtained reference must be released after use. Usually it is recommended that return value are assigned to _var type variables are wonership would be released automatically.
{ PortableServer::POA_var poa = Manager::instance().getPOA();; poa->servant_to_id(m_servant); } // POA's reference in orb is released here.
PortableServer::POAManager_ptr RTC::Manager::getPOAManager | ( | ) |
Get POAManager that Manager has (ownership duplicated)
Get POAMAnager that has been set to Manager. The ownership is copied (the reference count is incremented.), calling side also obtains reference ownership. The obtained reference must be released after use. Usually it is recommended that return value are assigned to _var type variables are wonership would be released automatically.
{ PortableServer::POAManager_var poam; poam = = Manager::instance().getPOAManager(); poam->activate(); } // POAManager's reference in orb is released here.
|
protected |
comp |
|
static |
Initialize manager.
This is the static member function to initialize the Manager. The Manager is initialized by given commandline arguments. To use the manager, this initialization member function init() must be called. The manager has two static functions to get the instance such as init() and instance(). Since initializing process is only performed by the init() function, the init() has to be called at the beginning of the lifecycle of the Manager.
*Initialization of manager
argc | The number of command line arguments. |
argv | The array of the command line arguments. |
|
protected |
PeriodicECSharedComposite initialization.
|
protected |
|
protected |
ExecutionContextManager initialization.
Initialize each ExecutionContext that is used, and register each ExecutionContext creation Factory to ExecutionContextManager.
|
protected |
Factories initialization.
Initialize buffer factories, thread factories, publisher factories, provider factories, and consumer factories.
bool RTC::Manager::initLocalService | ( | ) |
LocalService initialization.
|
protected |
System logger initialization.
Initialize System logger. Initialize logger and set it according to the set information in configuration file,
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
ManagerServant initialization.
|
protected |
NamingManager initialization.
Initialize NamingManager . However, operate nothing, if it is set to property that NamingManager is not used. Register default NamingServer that is set to property information, when NamingManager is used. Also, launch a timer that updates information automatically at specified cycle and register the method for the update to the timer, when it is set to update it reguraly.
|
protected |
CORBA ORB initialization.
Initialize ORB based on the configuration given by arguments.
|
protected |
|
protected |
|
protected |
|
protected |
Timer initialization.
Initialize each Timer that is used. (In current implementation, nothing is done.)
|
static |
Get instance of the manager.
This is the static member function to get the instance of the Manager. Before calling this function, ensure that the initialization function "init()" is called.
Referenced by CORBA_SeqUtil::refToVstring().
|
protected |
void RTC::Manager::join | ( | ) |
ReturnCode_t RTC::Manager::load | ( | const std::string & | fname, |
const std::string & | initfunc | ||
) |
[CORBA interface] Load module
Load specified module (shared library, DLL etc..), and invoke initialize function.
fname | The module file name |
initfunc | The initialize function name |
|
protected |
Merge property information.
Load property information that is configured in the specified file, and merge existing properties that has been configured.
prop | Target properties for the merge |
file_name | File name that property information is described |
void RTC::Manager::notifyFinalized | ( | RTObject_impl * | comp | ) |
This method deletes RT-Components.
The deleted RT-Component is registered. The registered RT-Components are deleted by cleanupComponents().
Deleted | RT component |
|
protected |
Extracting component type/properties from the given string.
This operation extracts component type name and its properties from the figen character string. The given string formats is the following.
[RTC type]?[key(0)]=[val(0)]&[key(1)]=[val(1)]...[key(n)]=[val(n)]
Returned value "comp_id" has keys of "vendor", "category", "implementation_id", "version", and returned as Properties type object. "comp_conf" is returned as Properties type object includeing component properties to be given to component.
comp_arg | character string to be processed |
comp_type | extracted component type name |
comp_prop | extracted component's properties |
|
protected |
Extracting ExecutionContext's name/properties from the given string.
This operation extracts ExecutionContext's name and its properties from the figen character string. The given string formats is the following.
[ExecutionContext's name]?[key(0)]=[val(0)]&[key(1)]=[val(1)]...[key(n)]=[val(n)]
"ec_conf" is returned as Properties type object includeing component properties to be given to component.
ec_arg | character string to be processed |
ec_type | extracted ExecutionContext's name |
ec_prop | extracted ExecutionContext's properties |
|
protected |
comp |
bool RTC::Manager::registerComponent | ( | RTObject_impl * | comp | ) |
Register RT-Component directly without Factory.
Register specified RT-Component's instances not via Factory to Manager directly.
comp | Target RT-Component's instances for the registration |
bool RTC::Manager::registerECFactory | ( | const char * | name, |
ECNewFunc | new_func, | ||
ECDeleteFunc | delete_func | ||
) |
Register ExecutionContext Factory.
Register Factory to create ExecutionContext's instances.
name | ExecutionContext name for the creation |
new_func | ExecutionContext creation function |
delete_func | ExecutionContext destruction function |
bool RTC::Manager::registerFactory | ( | coil::Properties & | profile, |
RtcNewFunc | new_func, | ||
RtcDeleteFunc | delete_func | ||
) |
Register RT-Component Factory.
Register Factory to create RT-Component's instances.
profile | RT-Component profile |
new_func | RT-Component creation function |
delete_func | RT-Component destruction function |
void RTC::Manager::removeLocalServiceActionListener | ( | RTM::LocalServiceActionListener * | listener | ) |
void RTC::Manager::removeManagerActionListener | ( | RTM::ManagerActionListener * | listener | ) |
void RTC::Manager::removeModuleActionListener | ( | RTM::ModuleActionListener * | listener | ) |
void RTC::Manager::removeNamingActionListener | ( | RTM::NamingActionListener * | listener | ) |
void RTC::Manager::removeRtcLifecycleActionListener | ( | RTM::RtcLifecycleActionListener * | listener | ) |
void RTC::Manager::runManager | ( | bool | no_block = false | ) |
Run the Manager.
This operation processes the main event loop of the Manager. In this main loop, CORBA's ORB event loop or other processes are performed. As the default behavior, this operation is going to blocking mode and never returns until Manager::destroy() is called. When the given argument "no_block" is set to "true", this operation creates a thread to process the event loop internally, and it doesn't block and returns.
no_block | false: Blocking mode, true: non-blocking mode. |
|
protected |
Setting endpoint info from corba.endpoints.
void RTC::Manager::setModuleInitProc | ( | ModuleInitProc | proc | ) |
Set initial procedure.
This operation sets the initial procedure call to process module initialization, other user defined initialization and so on. The given procedure will be called at the proper timing after the manager initialization, activation and run.
proc | A function pointer to the initial procedure call |
void RTC::Manager::shutdown | ( | ) |
Shutdown Manager.
Terminate manager's processing. After terminating ORB, shutdown manager in sync.
|
protected |
NamingManager finalization.
Get a list of RT-Components that have been registered to NamingManager, and shutdown all components.
|
protected |
|
protected |
|
protected |
NamingManager finalization.
Finalize NamingManager. Unbind all registered elements and shutdown them.
|
protected |
|
protected |
ORB finalization.
Finalize ORB . When the waiting process exists, wait until it completes. In actual finalization, deactivate POA Manager and then shutdown of ORB.
|
protected |
comp |
void RTC::Manager::terminate | ( | ) |
Terminate manager.
Terminate manager's processing
CORBA::ORB_ptr RTC::Manager::theORB | ( | ) |
Get the pointer to ORB (ownership retained)
Get the pointer to ORB that has been set to Manager. The ownership of ORB is retained. If the returned value is assigned to _var variable, getORB() operation must be used. This operation is provided for the following use.
Manager::instance().theORB()->string_to_object(<IOR string>);
PortableServer::POA_ptr RTC::Manager::thePOA | ( | ) |
Get a pointer to RootPOA held by Manager.
Get the pointer to RootPOA that has been set to Manager. The ownership of POA is retained. If the returned value is assigned to _var variable, getPOA() operation must be used. This operation is provided for the following use.
Manager::instance().getPOA()->servant_to_id(m_servant);
PortableServer::POAManager_ptr RTC::Manager::thePOAManager | ( | ) |
Get POAManager that Manager has (ownership retained)
Get POAMAnager that has been set to Manager. The ownership of POAManager is retained. If the returned value is assigned to _var variable, getPOAManager() operation must be used. This operation is provided for the following use.
Manager::instance().thePOAManager()->activate();
void RTC::Manager::unload | ( | const char * | fname | ) |
Unload module.
Unload module.
fname | The module file name |
void RTC::Manager::unloadAll | ( | ) |
Unload all modules.
Unload all modules.
bool RTC::Manager::unregisterComponent | ( | RTObject_impl * | comp | ) |
Unregister RT-Components.
Unregister specified RT-Components
comp | Target RT-Component's instances for the unregistration |
|
protected |
ComponentManager.
|
protected |
Managaer's configuration Properties.
|
protected |
ExecutionContext Manager.
|
protected |
ExecutionContext list.
|
protected |
ComponentManager.
|
protected |
|
protected |
User's initialization function's pointer.
|
protected |
|
protected |
Files for log output.
|
protected |
Logger buffer.
|
protected |
The pointer to the ManagerServant.
|
protected |
The pointer to the ModuleManager.
|
protected |
The pointer to the NamingManager.
|
protected |
The pointer to the ORB.
|
protected |
The pointer to the POA.
|
protected |
The pointer to the POAManager.
|
protected |
The pointer to ORB helper class.
|
protected |
Synchronous flag for manager termination.
Flag used to take synchronization by join().
|
protected |
The pointer to ORB termination helper class.
|
protected |
Timer Object.