iPOPO Components

A component is an object with a life-cycle, requiring services and providing ones, and associated to properties. The code of a component is reduced to its functional purpose: its life-cycle, dependencies, etc. are handled by iPOPO. In iPOPO, a component is an instance of component factory, i.e. a Python class manipulated with the iPOPO decorators.

Note

Due to the use of Python properties, all component factories must be new-style classes. It is the case of all Python 3 classes, but Python 2.x classes must explicitly inherit from the object class.

Life-cycle

The component life cycle is handled by an instance manager created by the iPOPO service. This instance manager will inject control methods, run-time dependencies, and will register the component services. All changes will be notified to the component using the callback methods it decorated.

iPOPO component life-cycle graph
State Description
INSTANTIATED The component has been instantiated. Its constructor has been called and the control methods have been injected
VALIDATED All required dependencies have been injected. All services provided by the component will be registered right after this method returned
KILLED The component has been invalidated and won’t be usable again
ERRONEOUS The component raised an error during its validation. It is not destroyed and a validation can be retried manually

API

iPOPO components are handled through the iPOPO core service, which can itself be accessed through the Pelix API or the utility context manager use_ipopo(). The core service provides the pelix.ipopo.core specification.

Here are the most commonly used methods from the iPOPO core service to handle components and factories:

A word on Python 3.7 Data classes

These indications have to be taken into account when using iPOPO decorators on data classes. They are also valid when using the dataclasses package for Python 3.6.

Important notes

  • All fields of the Data Class must have a default value. This will let the @dataclass decorator generate an __init__ method without explicit arguments, which is a requirement for iPOPO.
  • If the init=False argument is given to @dataclass, it is necessary to implement your own __init__, defining all fields, otherwise generated methods like __repr__ won’t work.

Good to know

  • Injected fields (@Property, @Requires, …) will lose the default value given in the class definition, in favor to the ones given to the iPOPO decorators. This is due to the redefinition of the fields by those decorators. Other fields are not touched at all.
  • The @dataclass decorator can be used before or after the iPOPO decorators