 	/**
 	Sets the passed view as the contentView. Called whenever the contentView is replaced (normally this would be through an IBOutlet)
 	*/
-	func replaceContentView(oldContentView: NSView?, with newView: NSView) {
+	public func replaceContentView(oldContentView: NSView?, with newView: NSView) {
 		// if we already have an contentView, then we remove it now
 		if let oldContentView = oldContentView {
 			oldContentView.removeFromSuperview()

	Sets the collapsed/expanded state. Can be explicitly called by external sources, but is usually invoked
	by the disclosure button.
	*/
	func collapseOrExpand(expand: Bool) {
		if expand {
			NSAnimationContext.runAnimationGroup({ context in
				context.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)

	/**
	Disclosure button target-action callback
	*/
	public func toggleExpand(sender: AnyObject?) {
		self.collapseOrExpand(!self.expanded)
	}
	
	/**
	Returns the disclosure button text based on the current expansion state
	*/
	public func titleDisclosureButtonText() -> String {
		return self.expanded ? "▼" : "►"
	}
}
