':calls: `POST /repos/:owner/:repo/issues <http://developer.github.com/v3/issues>`_
:param title: string
:param body: string
:param assignee: string or :class:`github.NamedUser.NamedUser`
:param milestone: :class:`github.Milestone.Milestone`
:param labels: list of :class:`github.Label.Label`
:rtype: :class:`github.Issue.Issue`'

def create_issue(self, title, body=github.GithubObject.NotSet, assignee=github.GithubObject.NotSet, milestone=github.GithubObject.NotSet, labels=github.GithubObject.NotSet):

    assert isinstance(title, (str, unicode)), title
    assert ((body is github.GithubObject.NotSet) or isinstance(body, (str, unicode))), body
    assert ((assignee is github.GithubObject.NotSet) or isinstance(assignee, github.NamedUser.NamedUser) or isinstance(assignee, (str, unicode))), assignee
    assert ((milestone is github.GithubObject.NotSet) or isinstance(milestone, github.Milestone.Milestone)), milestone
    assert ((labels is github.GithubObject.NotSet) or all(((isinstance(element, github.Label.Label) or isinstance(element, str)) for element in labels))), labels
    post_parameters = {'title': title}
    if (body is not github.GithubObject.NotSet):
        post_parameters['body'] = body
    if (assignee is not github.GithubObject.NotSet):
        if isinstance(assignee, (str, unicode)):
            post_parameters['assignee'] = assignee
        else:
            post_parameters['assignee'] = assignee._identity
    if (milestone is not github.GithubObject.NotSet):
        post_parameters['milestone'] = milestone._identity
    if (labels is not github.GithubObject.NotSet):
        post_parameters['labels'] = [(element.name if isinstance(element, github.Label.Label) else element) for element in labels]
    (headers, data) = self._requester.requestJsonAndCheck('POST', (self.url + '/issues'), input=post_parameters)
    return github.Issue.Issue(self._requester, headers, data, completed=True)
