We cannot rely on `Feature`'s static constructor to be called for every
feature class, so we move out relevant code into separate
`LoadConfigs()` method.
Previously `_textCache` relied on static constructor inside base classes
`AcediaObject` / `AceduaActor` to be created and filled with necessary
data. This was faulty approach, since their static constructor was only
ever supposed to be called once.
This patch moves `_textCache` creation into `_constructor()` and `T()`,
`P()`, `C()`, `F()` methods.
Make decoder work with byte arrays containing a single complete text,
instead of byte streams with several separate texts.
Moved codecs into "Text" category.
This patch changes how `Feature`s configs work - they are now required
to use a separate config object (each `Feature` their own class, derived
from `FeatureConfig`) that is to be used as a `perconfigobject` storage.
`Feature`s themselves are not supposed to interact with their config
objects directly, instead using JSON-serializable type, which should
allow us a universal way to change `Feature`'s config variables during
execution.
Now Acedia collections provide functionality of `Get...ByPointer()`
method (that allows to fetch values nested into several collection by
JSON pointers) for both `JSONPointer` and `Text` classes.
Previously, each use of `Get...ByPointer()` method caused convertion of
a `Text` into `JSONPointer`, even if used `Text` value did not change.
This patch allows to create `JSONPointer` once and them use that as a
parameter, which should be much faster.
Add method for checking whether certain `Text` is empty (`none` or has
zero recorded characters).
Add methods for converting and deallocation (in the same action) passed
`Text` value into the `string`.