use std::sync::Arc;
use crate::support::ServiceProvider;
use crate::container::Injectable;
pub trait Contract {
fn add_provider(&self, provider: Box<dyn ServiceProvider<Self> + 'static>) -> &Self;
fn add_providers(&self, providers: Vec<Box<dyn ServiceProvider<Self> + 'static>>) -> &Self;
fn boot(&self) -> &Self;
fn bind<T, F>(&self, factory: F)
where
T: Sized + Send + Sync + 'static,
F: Fn(&Self) -> Arc<T> + Send + Sync + 'static;
fn resolve<T>(&self) -> Arc<T>
where
T: Injectable + Send + Sync + 'static;
fn with_provider(self, provider: Box<dyn ServiceProvider<Self> + 'static>) -> Self;
fn build(&self) -> &Self;
}