register( PrivacyGuidance::class, static fn (ServiceContainer $c): PrivacyGuidance => new PrivacyGuidance( $c->resolve(\WConvert\Storage\OptionStore::class) ) ); $container->register( DataMap::class, static fn (ServiceContainer $c): DataMap => new DataMap( $c->resolve(RetentionPeriod::class), $c->resolve(DestinationStore::class), $c->resolve(DestinationRegistry::class), $c->resolve(\WConvert\Optin\OptinRepository::class), $c->resolve(\WConvert\Protection\Settings::class) ) ); $container->register( LeadErasure::class, static fn (ServiceContainer $c): LeadErasure => new LeadErasure( $c->resolve(LeadRepository::class), $c->resolve(DeliveryFailures::class) ) ); $container->register( LeadExporter::class, static fn (ServiceContainer $c): LeadExporter => new LeadExporter( $c->resolve(LeadRepository::class), $c->resolve(OptinRepository::class) ) ); $container->register( LeadEraser::class, static fn (ServiceContainer $c): LeadEraser => new LeadEraser($c->resolve(LeadErasure::class)) ); $container->register( PolicyText::class, static fn (ServiceContainer $c): PolicyText => new PolicyText($c->resolve(DataMap::class)) ); $container->register( LeadPruner::class, static fn (ServiceContainer $c): LeadPruner => new LeadPruner( $c->resolve(LeadRepository::class), $c->resolve(RetentionPeriod::class) ) ); } public function boot(ServiceContainer $container): void { $container->resolve(LeadExporter::class)->hooks(); $container->resolve(LeadEraser::class)->hooks(); $container->resolve(LeadPruner::class)->hooks(); // `admin_init` rather than now: the suggestion is only ever read by // the policy editor, and composing it means reading the retention // option — which is not autoloaded, so doing it here would put a // database query on every uncached front-end page load, the exact harm // ADR 0003 names. add_action('admin_init', static function () use ($container): void { $container->resolve(PolicyText::class)->register(); }); } }