Maybe its better to use `SplObjectStorage` here?