docs: protected boolean remove(Object child, boolean setChildBC)
  	{
  		if (child == null)
  		{
  			throw new IllegalArgumentException(Messages.getString("beans.67"));
  		}
  
  		Object peer = null;
  
  		synchronized (globalHierarchyLock)
  		{
  			// check existence
  			if (!contains(child))
  			{
  				return false;
  			}
  
  			// check serializing state
  			if (serializing)
  			{
  				throw new IllegalStateException(Messages.getString("beans.68"));
  			}
  
  			// validate
  			boolean valid = validatePendingRemove(child);
  			if (!valid)
  			{
  				throw new IllegalStateException(Messages.getString("beans.6E"));
  			}
  
  			// set child's beanContext property
  			BeanContextChild beanContextChild = getChildBeanContextChild(child);
  			if (beanContextChild != null && setChildBC)
  			{
  				// remove listener, first
  				beanContextChild.removePropertyChangeListener("beanContext", nonSerPCL);
  				try
  				{
  					beanContextChild.setBeanContext(null);
  				}
  				catch (PropertyVetoException e)
  				{
  					// rollback the listener change
  					beanContextChild.addPropertyChangeListener("beanContext", nonSerPCL);
  					throw new IllegalStateException(Messages.getString("beans.6B"));
  				}
  			}
  
  			// remove from children
  			BCSChild childBCSC = null, peerBCSC = null;
  			synchronized (children)
  			{
  				childBCSC = (BCSChild) children.remove(child);
  				peer = childBCSC.proxyPeer;
  				if (peer != null)
  				{
  					peerBCSC = (BCSChild) children.remove(peer);
  				}
  			}
  
  			// trigger hook
  			synchronized (child)
  			{
  				removeSerializable(childBCSC);
  				childJustRemovedHook(child, childBCSC);
  			}
  			if (peer != null)
  			{
  				synchronized (peer)
  				{
  					removeSerializable(peerBCSC);
  					childJustRemovedHook(peer, peerBCSC);
  				}
  			}
  		}
  
  		// notify listeners
  		fireChildrenRemoved(new BeanContextMembershipEvent(getBeanContextPeer(), peer == null ? new Object[] { child } : new Object[] { child, peer }));
  		return true;
  	}