class Program extends BaseNameableObject implements VersionedObject, MetadataObject {

    public void updateOrganisationUnits( Set<OrganisationUnit> updates )
    {
        Set<OrganisationUnit> toRemove = Sets.difference( organisationUnits, updates );
        Set<OrganisationUnit> toAdd = Sets.difference( updates, organisationUnits );

        toRemove.forEach( u -> u.getPrograms().remove( this ) );
        toAdd.forEach( u -> u.getPrograms().add( this ) );

        organisationUnits.clear();
        organisationUnits.addAll( updates );
    }

    public  Program();
    public  Program( String name, String description );

}