def get_or_create(self, name, version,
                      status=REGISTERED,
                      creation_date=0.0,
                      deprecation_date=0.0,
                      task_list=None,
                      child_policy=CHILD_POLICIES.TERMINATE,
                      execution_timeout='300',
                      decision_tasks_timeout='300',
                      description=None,
                      *args, **kwargs):
        """Fetches, or creates the ActivityType with ``name`` and ``version``

        When fetching trying to fetch a matching workflow type, only
        name and version parameters are taken in account.
        Anyway, If you'd wanna make sure that in case the workflow type
        has to be created it is made with specific values, just provide it.

        :param  name: name of the workflow type
        :type   name: String

        :param  version: workflow type version
        :type   version: String

        :param  status: workflow type status
        :type   status: swf.core.ConnectedSWFObject.{REGISTERED, DEPRECATED}

        :param   creation_date: creation date of the current WorkflowType
        :type    creation_date: float (timestamp)

        :param   deprecation_date: deprecation date of WorkflowType
        :type    deprecation_date: float (timestamp)

        :param  task_list: task list to use for scheduling decision tasks for executions
                           of this workflow type
        :type   task_list: String

        :param  child_policy: policy to use for the child workflow executions
                              when a workflow execution of this type is terminated
        :type   child_policy: CHILD_POLICIES.{TERMINATE |
                                              REQUEST_CANCEL |
                                              ABANDON}

        :param  execution_timeout: maximum duration for executions of this workflow type
        :type   execution_timeout: String

        :param  decision_tasks_timeout: maximum duration of decision tasks for this workflow type
        :type   decision_tasks_timeout: String

        :param  description: Textual description of the workflow type
        :type   description: String

        :returns: Fetched or created WorkflowType model object
        :rtype: WorkflowType
        """
        try:
            return self.get(name,
                            version,
                            task_list=task_list,
                            child_policy=child_policy,
                            execution_timeout=execution_timeout,
                            decision_tasks_timeout=decision_tasks_timeout)

        except DoesNotExistError:
            try:
                return self.create(
                    name,
                    version,
                    status=status,
                    creation_date=creation_date,
                    deprecation_date=deprecation_date,
                    task_list=task_list,
                    child_policy=child_policy,
                    execution_timeout=execution_timeout,
                    decision_tasks_timeout=decision_tasks_timeout,
                    description=description,
                )
            # race conditon could happen if two workflows trying to register the same type
            except AlreadyExistsError:
                return self.get(name,
                            version,
                            task_list=task_list,
                            child_policy=child_policy,
                            execution_timeout=execution_timeout,
                            decision_tasks_timeout=decision_tasks_timeout)